我现在正在阅读Programming 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-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])) ()
我不能得到的是为什么我们应该在拍对结果上调用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)))))))
在女巫案件中,会有不同的结果,还是有任何表现原因?
答案 0 :(得分:2)
两个代码都是相同的,因为next
和take
函数在take-pair
函数中被应用于coll,所以没有区别,请在seq
上调用next c
传递参数即seq
将首先在c上调用ISeq
或尝试检查它是否是实现take
的对象,并且在seq
函数执行时是相同的。所以基本上在这种情况下,如果您不自己致电next
,take
和seq
会在其上调用{{1}}。