【问题标题】:Does 'concat' break the laziness of 'line-seq'?'concat' 是否打破了 'line-seq' 的懒惰?
【发布时间】:2010-11-27 08:00:37
【问题描述】:

以下代码似乎强制 line-seq 从 file 读取 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

【问题讨论】:

    标签: clojure lazy-loading


    【解决方案1】:

    您看到的部分内容是由于apply,因为它需要实现函数定义所需的尽可能多的参数。例如:

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

    【讨论】:

      猜你喜欢
      • 2014-03-23
      • 2014-03-23
      • 1970-01-01
      • 2017-01-13
      • 2012-11-28
      • 2018-01-28
      • 1970-01-01
      • 1970-01-01
      • 2016-05-12
      相关资源
      最近更新 更多