Clojure doall dorun doseq和for函数之间的区别是什么?
Clojure doall dorun doseq和for函数之间的区别是什么?,clojure,Clojure,doall、dorun、doseq和的函数之间有什么区别 我在互联网上发现了一些分散的信息,但我认为最好将这些信息集中在这里。通过查看(简化的)源代码,您可以看到dorun和doall是如何相互关联的: (defn dorun [coll] (when (seq coll) (recur (next coll)))) (defn doall [coll] (dorun coll) coll) dorun在序列中运行,在运行过程中忘记了它, 最终返回nil doall返回其序列参数,现在
doall
、dorun
、doseq
和的函数之间有什么区别
我在互联网上发现了一些分散的信息,但我认为最好将这些信息集中在这里。通过查看(简化的)源代码,您可以看到
dorun
和doall
是如何相互关联的:
(defn dorun [coll]
(when (seq coll) (recur (next coll))))
(defn doall [coll] (dorun coll) coll)
在序列中运行,在运行过程中忘记了它, 最终返回dorun
nil
返回其序列参数,现在由doall
实现dorun
dorun
和for
方面实现doseq
:
(defmacro doseq [seq-exprs & body]
`(dorun (for ~seq-exprs ~@body)))
出于某种原因,性能可能,这是没有做到的。标准
doseq
是完整编写的,模仿for
dorun
、doall
和doseq
都是为了强制执行惰性序列,可能是为了获得副作用
-强制执行时不要将整个seq保存在内存中,返回dorun
nil
-在强制执行时将整个seq保存在内存中(即全部),并返回seqdoall
-与doseq
相同,但让您有机会在强制时对每个元素进行处理;返回dorun
nil
的不同之处在于它是一个列表理解,与强制效果无关doseq
和for
具有相同的绑定语法,这可能会造成混淆,但doseq
始终返回nil
,而for
返回一个懒惰的seq。谷歌是你的朋友-@edbond堆栈溢出是更好的选择friend@DaveYarwood该Wordpress网站已被删除。不确定您所说的“doseq
”是什么意思-与doall
相同,但它使您有机会对每个元素强制执行操作”。当然,这是一个类似于dorun
的版本,而不是doall
@Thumbnail的版本。我更新了答案以反映这一点。谢谢