3

我正在阅读clojure中关于rest vs next的解释。据我了解,它分解为next评估/实现序列的尾部,知道它是否应该返回nil,同时rest总是返回序列,所以它更懒惰。

但是,我不明白的是:这两个函数都需要知道尾部是否有东西。如果什么都没有,一个会返回nil,另一个会返回()

所以基本上,他们都需要检查/评估剩下的东西。甚至导致rest返回(),例如需要知道它不会返回(2)

所以甚至rest需要做评估。

但解释却恰恰相反。那只next做那个评估,但rest不做,因此更懒惰。

谁能解释一下?

4

1 回答 1

8
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需要评估一个元素,您会看到“嗨!” 我打电话后打印出来(rest test-seq)。显然,rest不需要为了工作做评估。

原因是rest不返回 () 或 (2) 或类似的东西;每次调用它时它都会返回一个未计算的惰性序列,并且只有在稍后对该序列进行评估时才会回答是否有任何要返回的问题。

于 2013-04-13T03:18:34.450 回答