根据 line-seq ( http://clojuredocs.org/clojure_core/clojure.core/line-seq ) 的 ClojureDocs 条目和 Stack 问题的公认答案 ( In Clojure 1.3, How to read and write a file ),当传递 java.io.BufferedReader 时,line-seq 应该返回一个惰性序列。
但是,当我在 REPL 中对此进行测试时,该类型被列为 clojure.lang.Cons。请看下面的代码:
=> (ns stack-question
(:require [clojure.java.io :as io]))
nil
=> (type (line-seq (io/reader "test-file.txt")))
clojure.lang.Cons
=> (type (lazy-seq (line-seq (io/reader "test-file.txt"))))
clojure.lang.LazySeq
在惰性序列调用中结束 line-seq 调用会产生惰性序列,但根据文档,这不是必需的:无论如何,line-seq 都应该返回惰性序列。
注意:在 REPL(我正在使用 nrepl)内部,似乎惰性 seq 已完全实现,所以我认为这可能只是 REPL 的一个怪癖;但是,当我使用 Speclj 对其进行测试时,也存在同样的问题。另外,我不认为实现惰性序列与正在发生的事情有关。
编辑:所以我在mobyte的回答说缺点的尾部有一个惰性序列后去检查源代码......
1 (defn line-seq
2 "Returns the lines of text from rdr as a lazy sequence of strings.
3 rdr must implement java.io.BufferedReader."
4 {:added "1.0"}
5 [^java.io.BufferedReader rdr]
6 (when-let [line (.readLine rdr)]
7 (cons line (lazy-seq (line-seq rdr)))))
对 cons 的调用可以解释为什么 line-seq 的返回值的类型是 clojure.lang.Cons。