2012-07-21 63 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