Clojure로 텍스트의 문자 수 세기

지난 번에 작성한 것은 단순히 '가'부터 '힣'까지 차례로 출력하는 코드였다.
이번에는 저장된 웹페이지로부터 한글 유니코드만 읽어들여 각 문자 별로 몇 개
발생했는 지 그 수를 세는 코드를 작성한다.

다음은 file.html에 저장된 파일 내용을 읽어들여 그 중에서 한글 유니코드만 시퀀스로 만들어주는 코드이다.
slurp는 파일을 읽어들여 그 내용을 리스트로 만들어주는 함수로, 아주 큰 파일
(한도가 얼마인 지는 세보지 못했다)만 아니면 유용하게 사용할 수 있다고 한다.
파일 경로 뿐 아니라 http url을 넣어주면 바로 웹 페이지를 읽어들일 수도 있다.

(filter
  (fn [x] (and (>= (int x) (int \가)) (<= (int x) (int \힣))))
  (slurp "/somewhere/in/file.html"))

다음은 각 문자 별로 발생 갯수를 세서 더하는 함수로, 아직 clojure 실력이 미천하다 보니(...) 어떻게 작성할까 검색하다가 발견한 코드이다. 다음은 clojuredocsupdate-in 예제 코드에서 사용된 함수이다. 1.2.0부터 지원하는 함수인 듯 하다.
fnil도 같이 봐두면 좋다.

(defn char-cnt  [s]
  "Counts occurrence of each character in s"
  (reduce
    (fn  [m k]
      (update-in m  [k]  (fnil inc 0)))
    {}
    (seq s)))

char-cnt 함수를 돌린 결과는 다음과 같다.

(char-cnt (filter
  (fn [x] (and (>= (int x) (int \가)) (<= (int x) (int \힣))))
  (slurp "/somewhere/in/file.html")))
{\가 86, \저 9, \퀀 1, \될 7, \낀 1, \좀 3, \풀 1, \겠 2, ...

여기에 sort 까지 해주면 모양새가 더 좋겠지만 이번에 하려는 작업에서는 필요 없기 때문에 생략.