The following code a开发者_运维知识库ppears to force line-seq
to read 4 lines from file
. Is this some kind of buffering mechanism? Do I need to use lazy-cat
here? If so, how can I apply
a macro to a sequence as if it were variadic arguments?
(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
Part of what you're seeing is due to apply
, since it will need to realize as many args as needed by the function definition. 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
精彩评论