2013-04-13 40 views
2

我在閱讀解釋其餘下一個在clojure。 據我瞭解,它分解爲next評估/實現序列的尾部, 知道它應該返回nil或沒有,而rest總是返回序列,所以它是懶惰的。下一個休息在clojure

但是,我不明白的是:這兩個功能都需要知道尾巴里有什麼東西 。如果沒有剩下任何東西,則返回nil,其他人將返回()

所以基本上,他們都需要檢查/評估剩下的東西。 原因即使rest,要返回(),需要知道它不會返回例如(2)例如。

所以即使rest也需要做評估。

但解釋說的相反。 那只有next做那個評價,但rest沒有,所以比較懶。

任何人都可以解釋一下嗎?

回答

7
user> (def test-seq (lazy-cat [1] [(do (print "Hi!") 2)])) 
#'user/test-seq 
user> (def rest-test (rest test-seq)) 
#'user/rest-test 
user> (def next-test (next test-seq)) 
Hi! 
#'user/next-test 

如果rest需要評估一個元素,您會看到「Hi!」我打電話給(rest test-seq)後打印。顯然,rest不需要做評估才能工作。

原因是rest不返回()或(2)或類似的東西;它每次調用時都會返回一個未評估的惰性序列,只有在稍後評估該序列時纔回答是否有任何要返回的問題。

+0

我想我明白了。 Clojure其實非常簡單。 –