Clojure 我应该在什么时候从惰性序列生成序列
我现在正在阅读,我发现了下一个例子Clojure 我应该在什么时候从惰性序列生成序列,clojure,Clojure,我现在正在阅读,我发现了下一个例子 (defn by-pairs [coll] (let [take-pair (fn [c] (when (next c) (take 2 c)))] (lazy-seq (when-let [pair (seq (take-pair coll))] ;seq calls here (cons pair (by-pairs (rest coll))))))) 它将列表分成两部分,如 (println (by-pa
(defn by-pairs [coll]
(let
[take-pair (fn [c] (when (next c) (take 2 c)))]
(lazy-seq
(when-let [pair (seq (take-pair coll))] ;seq calls here
(cons pair (by-pairs (rest coll)))))))
它将列表分成两部分,如
(println (by-pairs [1 2 1])) ((1 2) (2 1))
(println (by-pairs [1 2 1 3])) ((1 2) (2 1) (1 3))
(println (by-pairs [])) ()
(println (by-pairs [1])) ()
我无法理解的是,为什么我们应该在take pair结果中调用seq?那么为什么我们不能只写
(defn by-pairs [coll]
(let
[take-pair (fn [c] (when (next c) (take 2 c)))]
(lazy-seq
(when-let [pair (take-pair coll)]
(cons pair (by-pairs (rest coll)))))))
在这种情况下,会有不同的结果或有任何性能原因吗?这两个代码是相同的,不会有任何区别,因为
next
和take
函数应用于coll Intake pair
函数,对传递的参数调用seq
,即next c
将首先对c调用seq
,或者尝试检查它是否是实现ISeq
的对象,以及take
函数正在执行的操作。因此,基本上在这种情况下,如果您自己不调用seq
,那么next
和take
将调用seq