Clojure:rest与下一个
我很难理解Clojure中rest
和rest
的区别。 官方网站关于懒惰的页面表明,偏好应该是用rest
,但是这并不能真正解释两者之间的差别。 任何人都可以提供一些见解吗?
正如你所链接的页面所描述的, next
比( rest
的新行为)更严格,因为它需要评估懒惰的结构以知道是否返回nil
或seq。
rest
另一方面总是返回一个seq,所以没有什么需要评估,直到你真正使用rest
的结果。 换句话说, rest
比next
更懒。
如果你有这个,很容易:
(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或者退出最后一个项目的时候返回一个空的集合。