2010-11-27 50 views
1

以下代码似乎强制要求line-seqfile中读取4行。这是一种缓冲机制吗?我需要在这里使用lazy-cat吗?如果是这样,我怎样才能将一个宏作为一个序列,就像它是可变参数一样?你看到的'concat'是否打破'line-seq'的懒惰?

(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 

回答

3

部分原因是apply,因为它需要在需要时由函数定义,实现尽可能多的ARGS。例如:

 
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