Clojure:rest与下一个

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

正如你所链接的页面所描述的, next比( rest的新行为)更严格,因为它需要评估懒惰的结构以知道是否返回nil或seq。

rest另一方面总是返回一个seq,所以没有什么需要评估,直到你真正使用rest的结果。 换句话说, restnext更懒。

如果你有这个,很容易:

 (next '(1)) => nil 

next看下一个东西,如果这行是空的,则返回nil而不是空的seq。 这意味着它需要向前看(它将返回的第一个项目),这使得它不完全懒惰(也许你不需要下一个值,但next浪费计算时间来outlook)。

 (rest '(1)) => () 

rest不会向前看,只是返回seq的其余部分。

也许你会这样想:为什么在这里还要用两种不同的东西呢? 原因在于你通常想知道seq中是否没有任何东西,只是返回nil ,但在某些情况下,性能是非常重要的,评估一个项目可能意味着巨大的努力,你可以使用rest

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

rest会返回一个序列的剩余部分。 如果这一段序列还没有实现, rest不会强迫它。 它甚至不会告诉你是否有更多的元素留在序列中。

next做同样的事情,但是至less迫使序列的至less一个要素被实现。 所以如果next返回nil ,就知道序列中没有剩下的元素了。

我现在更喜欢使用next回报,因为越狱评估更简单/更清洁:

 (loop [lst a-list] (when lst (recur (next lst)) 

VS

 (loop [lst a-list] (when-not (empty? lst) ;; or (when (seq? lst) (recur (rest lst)) 

但是,如果使用集合作为队列或堆栈,则可以使用rest 。 在这种情况下,你想让你的函数在popup或者退出最后一个项目的时候返回一个空的集合。