2012-07-21 69 views
2

使序列我读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 on take pair结果?那么为什么我们不能只写

(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))))))) 

在女巫的情况下会有不同的结果或有任何性能的原因?

回答

2

两个密码是相同的,不会有任何区别,因为正在应用nexttake功能在take-pair功能科尔,请致电seq上即next c传递的参数会先调用seq在C或尝试检查它是实现ISeq的一个对象,并且与take函数相同。因此,基本上在这种情况下,如果您自己不拨打seq,则nexttake将在其上调用seq