接下来,休息一下

ton*_*o.j 2 functional-programming clojure

我正在阅读关于休息下一个 clojure的解释.据我了解,它分解为next评估/实现序列的尾部,知道它应该返回nil还是不rest返回,同时总是返回序列,因此它更加懒惰.

然而,我不明白的是:两个功能都需要知道尾部有什么东西.一个将返回nil如果有一无所有,其他人会返回().

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

所以甚至rest需要做评估.

但解释却恰恰相反.这只是next评估,但rest不是,因此更懒惰.

谁能解释一下?

Wol*_*Fan 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
Run Code Online (Sandbox Code Playgroud)

如果rest需要评估一个元素,你会看到"嗨!" 打完电话后打印出来(rest test-seq).显然,rest不需要做评估才能工作.

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