'concat'会打破'line-seq'的懒惰吗?

时间:2010-11-27 08:00:38

标签: clojure lazy-loading

以下代码似乎强制line-seqfile读取4行。这是某种缓冲机制吗?我需要在这里使用lazy-cat吗?如果是这样,我如何apply一个宏到一个序列,好像它是可变参数?

(defn char-seq [rdr]
  (let [coll (line-seq rdr)]
    (apply concat (map (fn [x] (println \,) x) coll))))

(def tmp (char-seq (clojure.contrib.io/reader file)))

;,
;,
;,
;,
#'user/tmp

1 个答案:

答案 0 :(得分:3)

您所看到的部分内容归因于apply,因为它需要实现函数定义所需的尽可能多的args。 E.g:

user=> (defn foo [& args] nil)
#'user/foo
user=> (def bar (apply foo (iterate #(let [i (inc %)] (println i) i) 0)))
1
#'user/bar
user=> (defn foo [x & args] nil)
#'user/foo
user=> (def bar (apply foo (iterate #(let [i (inc %)] (println i) i) 0)))
1
2
#'user/bar
user=> (defn foo [x y & args] nil)
#'user/foo
user=> (def bar (apply foo (iterate #(let [i (inc %)] (println i) i) 0)))
1
2
3
#'user/bar