Dan*_*sky 66 clojure lazy-evaluation
我很难理解Clojure rest
和next
Clojure 之间的区别.官方网站关于懒惰的页面表明偏好可能应该是使用rest
,但它并没有真正解释两者之间的差异.任何人都能提供一些见解吗?
sep*_*p2k 63
由于您链接描述的页面next
比(新行为)更严格,rest
因为它需要评估惰性缺点的结构以了解是返回nil
还是seq.
rest
另一方面总是返回一个seq,所以在你实际使用结果之前不需要进行任何评估rest
.换句话说,rest
比较懒next
.
nic*_*kik 31
如果你有这个很容易:
(next '(1))
=> nil
Run Code Online (Sandbox Code Playgroud)
所以next
看下一件事情,如果该行为空,则返回nil
而不是空seq.这意味着它需要向前看(对于它将返回的第一个项目),这使得它不是完全懒惰的(可能你不需要下一个值,但是next
浪费计算时间来向前看).
(rest '(1))
=> ()
Run Code Online (Sandbox Code Playgroud)
rest
没有向前看,只返回seq的其余部分.
也许你会想,为什么在这里使用两种不同的东西呢?原因是你通常想知道seq中是否还有什么东西只是返回nil
,但在某些情况下,性能非常重要并且评估一个项目可能意味着你可以使用的巨大努力rest
.
Stu*_*rra 21
next
就像(seq (rest ...))
.
rest
将返回序列的剩余部分.如果序列中的那部分尚未实现,rest
则不会强制它.它甚至不会告诉您序列中是否还有更多元素.
next
做同样的事情,但然后强制实现序列的至少一个元素.因此,如果next
返回nil
,您知道序列中不再有任何元素.