关于clojure:“ concat”会打破“ line-seq”的惰性吗?

Does 'concat' break the laziness of 'line-seq'?

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

1
2
3
4
5
6
7
8
9
10
11
(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

您看到的部分原因是apply,因为它将需要实现函数定义所需的尽可能多的args。 例如。:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
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