doall dorun doseq和for的功能有什么区别?

Car*_*nes 46 clojure

有什么功能之间的差异doall,dorun,doseq,和for

我发现一些信息散布在整个互联网上,但我认为最好将这些信息集中在这里.

ove*_*ink 55

dorun,doalldoseq,都是为了强迫懒惰的序列,大概是为了得到副作用.

  • dorun - 强迫,返回时不要将整个seq保留在内存中 nil
  • doall- 在强制(即全部)时将整个seq保持在内存中并返回seq
  • doseq- 同样的dorun,但是你有机会对每个元素做一些事情,因为它是被迫的; 回报nil

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

  • 不确定你的'`doseq'是什么意思 - 和`doall`一样,但是你有机会对每个元素做一些事情,因为它被迫'.当然,它是`for`-like版本的`dorun`,而不是`doall`. (2认同)

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在条款dorunfor:

(defmacro doseq [seq-exprs & body]
  `(dorun (for ~seq-exprs ~@body)))
Run Code Online (Sandbox Code Playgroud)

出于某种原因,或许表现,这是没有做到的.标准doseq是完整的,模仿的for.