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
都是为了强制执行惰性序列,可能是为了获得副作用

  • dorun
    -强制执行时不要将整个seq保存在内存中,返回
    nil
  • doall
    -在强制执行时将整个seq保存在内存中(即全部),并返回seq
  • doseq
    -与
    dorun
    相同,但让您有机会在强制时对每个元素进行处理;返回
    nil

的不同之处在于它是一个列表理解,与强制效果无关
doseq
for
具有相同的绑定语法,这可能会造成混淆,但
doseq
始终返回
nil
,而
for
返回一个懒惰的seq。

谷歌是你的朋友-@edbond堆栈溢出是更好的选择friend@DaveYarwood该Wordpress网站已被删除。不确定您所说的“
doseq
”是什么意思-与
doall
相同,但它使您有机会对每个元素强制执行操作”。当然,这是一个类似于
dorun
版本,而不是
doall
@Thumbnail的版本。我更新了答案以反映这一点。谢谢