ove*_*ink 55
dorun,doall和doseq,都是为了强迫懒惰的序列,大概是为了得到副作用.
dorun - 强迫,返回时不要将整个seq保留在内存中 nildoall- 在强制(即全部)时将整个seq保持在内存中并返回seqdoseq- 同样的dorun,但是你有机会对每个元素做一些事情,因为它是被迫的; 回报nilfor不同之处在于它是列表理解,与强制效果无关.doseq并且for具有相同的绑定语法,这可能是混淆的来源,但doseq总是返回nil,并for返回一个懒惰的seq.
Thu*_*ail 19
你可以看到dorun,并doall通过查看(简体)的源代码之间的相互关系:
(defn dorun [coll]
(when (seq coll) (recur (next coll))))
(defn doall [coll] (dorun coll) coll)
Run Code Online (Sandbox Code Playgroud)
dorun贯穿整个序列,忘记它,最终回归nil.doall返回它的序列参数,现在由dorun.同样,我们可以实现doseq在条款dorun和for:
(defmacro doseq [seq-exprs & body]
`(dorun (for ~seq-exprs ~@body)))
Run Code Online (Sandbox Code Playgroud)
出于某种原因,或许表现,这是没有做到的.标准doseq是完整的,模仿的for.