doall dorun doseq和for函数有什么区别?
doall
, dorun
, doseq
和for
函数之间有什么区别?
我发现在整个互联网上散布着一些信息,但是我认为将信息集中在这里会更好。
dorun
, doall
和doseq
都是为了强迫懒惰的序列,可能是为了得到副作用。
-
dorun
– – while while while while </dorun
-
doall
– 在强制(即全部 )时保持整个seq在内存中并返回seq -
doseq
– 与doseq
相同,但是让你有机会在每个元素上做一些事情, 返回nil
for
它是一个列表理解,与强迫效果无关。 doseq
和具有相同的绑定语法,这可能是一个混淆的来源,但是doseq
总是返回nil
,并且返回一个懒惰的seq。
你可以通过查看(简化的)源代码来看到dorun
和doall
是如何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
被写满,模仿。