Clojure:休息与下一个

Dan*_*sky 66 clojure lazy-evaluation

我很难理解Clojure restnextClojure 之间的区别.官方网站关于懒惰的页面表明偏好可能应该是使用rest,但它并没有真正解释两者之间的差异.任何人都能提供一些见解吗?

sep*_*p2k 63

由于您链接描述的页面next比(新行为)更严格,rest因为它需要评估惰性缺点的结构以了解是返回nil还是seq.

rest另一方面总是返回一个seq,所以在你实际使用结果之前不需要进行任何评估rest.换句话说,rest比较懒next.

  • 增加混乱:`(drop 1 s)`比'rest'更懒,因为它不会强制部分实现s.`rest`不保证只能实现懒惰seq的第1项.这取决于懒惰的seq. (5认同)

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.

  • 只是为了击败它:(休息零)=>() (7认同)

Stu*_*rra 21

next就像(seq (rest ...)).

rest将返回序列的剩余部分.如果序列中的那部分尚未实现,rest则不会强制它.它甚至不会告诉您序列中是否还有更多元素.

next做同样的事情,但然后强制实现序列的至少一个元素.因此,如果next返回nil,您知道序列中不再有任何元素.