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被写满,模仿。