函数doall
,dorun
,doseq
和for
之间有什么区别?
我发现一些信息散布在整个互联网上,但我认为最好将这些信息集中在这里。
答案 0 :(得分:53)
dorun
,doall
和doseq
都是为了强制延迟序列,可能是为了产生副作用。
dorun
- 强制时不要在内存中保留整个seq,返回nil
doall
- 在强制中保持整个seq(即所有)并返回seq doseq
- 与dorun
相同,但是有机会对每个元素进行强制执行;返回nil
for
的不同之处在于它是列表理解,与强制效果无关。 doseq
和for
具有相同的绑定语法,这可能会引起混淆,但doseq
始终返回nil
,for
返回惰性seq。
答案 1 :(得分:18)
通过查看(简化的)源代码,您可以了解dorun
和doall
之间的关系:
(defn dorun [coll]
(when (seq coll) (recur (next coll))))
(defn doall [coll] (dorun coll) coll)
dorun
贯穿整个序列,忘了它,
最终返回nil
。doall
返回其序列参数,现在由dorun
实现。同样,我们可以在doseq
和dorun
方面实施for
:
(defmacro doseq [seq-exprs & body]
`(dorun (for ~seq-exprs ~@body)))
出于某种原因,或许表现,这是没有做到的。标准doseq
已完整写出,模仿for
。