doall dorun doseq和for函数有什么区别?

doalldorundoseqfor函数之间有什么区别?

我发现在整个互联网上散布着一些信息,但是我认为将信息集中在这里会更好。

dorundoalldoseq都是为了强迫懒惰的序列,可能是为了得到副作用。

  • dorun – – while while while while </ dorun
  • doall – 在强制(即全部 )时保持整个seq在内存中并返回seq
  • doseq – 与doseq相同,但是让你有机会在每个元素上做一些事情, 返回nil

for它是一个列表理解,与强迫效果无关。 doseq和具有相同的绑定语法,这可能是一个混淆的来源,但是doseq总是返回nil ,并且返回一个懒惰的seq。

你可以通过查看(简化的)源代码来看到dorundoall是如何dorun关联的:

 (defn dorun [coll] (when (seq coll) (recur (next coll)))) (defn doall [coll] (dorun coll) coll) 
  • dorun运行顺序,忘记它,最终返回nil
  • doall返回现在由dorun实现的序列参数。

同样,我们可以doseq的方式实施doseq ,并且:

 (defmacro doseq [seq-exprs & body] `(dorun (for ~seq-exprs ~@body))) 

出于某种原因,性能也许,这是没有完成的。 标准doseq被写满,模仿。