Dan*_*sky 66 clojure lazy-evaluation
我很难理解Clojure rest和nextClojure 之间的区别.官方网站关于懒惰的页面表明偏好可能应该是使用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,您知道序列中不再有任何元素.
| 归档时间: |
|
| 查看次数: |
9254 次 |
| 最近记录: |