Clojure でテキストファイルを読んでみる。(遅延評価)

遅延評価タイプにしながらも途中で閉じることができるようにすると、こういう感じになるようです。

(use '[clojure.contrib.duck-streams :only (reader)])
(defn file-reader [target]
  (let [r (reader target)]
   {:close (fn [] (.close r))
    :seq
      (letfn [(readline []
        (try
          (let [line (.readLine r)]
            (if line
              (lazy-seq (cons line (readline)))
              (.close r)))
          (catch java.io.IOException _ (try (.close r) (catch Exception ignore nil)))))]
        (readline))}))

;-- 開いて閉じる
(def readme (file-reader "readme.txt"))
((readme :close))

;-- 開いて3行読んで閉じる
(def readme (file-reader "readme.txt"))
(take 3 (readme :seq))
((readme :close))

゚▽゚)なんか面白くなってきた。