什么时候我应该从懒惰序列中制作序列

时间:2012-07-21 17:20:14

标签: clojure

我现在正在阅读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)))))))

在女巫案件中,会有不同的结果,还是有任何表现原因?

1 个答案:

答案 0 :(得分:2)

两个代码都是相同的,因为nexttake函数在take-pair函数中被应用于coll,所以没有区别,请在seq上调用next c传递参数即seq将首先在c上调用ISeq或尝试检查它是否是实现take的对象,并且在seq函数执行时是相同的。所以基本上在这种情况下,如果您不自己致电nexttakeseq会在其上调用{{1}}。