【问题标题】:Are there any differences between doseq and for combined with dorun?doseq 和 for 与 dorun 的组合有什么区别吗?
【发布时间】:2015-08-01 00:02:16
【问题描述】:

我很了解the difference between doseq and for,但两者看起来非常相似。事实上,在我看来,doseq 可以很容易地实现为 for 的宏。

(defmacro doseq' [bindings & body]
  `(dorun (for ~bindings ~@body)))

此实现与 Clojure 的 doseq 实现之间是否存在任何功能差异,或者它们实际上是否相同(以一些可能的性能差异为模)?

【问题讨论】:

    标签: clojure


    【解决方案1】:

    从实际的角度来看,for 返回一个惰性序列这一事实意味着它无法在 core.async 中使用,因为它完全在同一个函数中运行。

    user> (require '[clojure.core.async :refer [chan go <! <!! >!]])
    

    使用剂量:

    user> (let [stuff (chan)]
            (go (while true
                  (println (<! stuff))))
            (go (doseq [a (range 4)]
                  (>! stuff a))))
    #object[clojure.core.async.impl.channels.ManyToManyChannel 0x523a18bc "clojure.core.async.impl.channels.ManyToManyChannel@523a18bc"]
    user> 0
    1
    2
    3
    

    使用 for 和 dorun:

    user> (let [stuff (chan)]
            (go (while true
                  (println (<! stuff))))
            (go (dorun (for [a (range 4)]
                         (>! stuff a)))))
    CompilerException java.lang.IllegalArgumentException: No method in multimethod '-item-to-ssa' for dispatch value: :fn, compiling:(form-init5662188991458325584.clj:4:9)
    

    失败,因为它试图在 go 块中跨函数调用,因此从 go 宏的范围内逃逸。

    【讨论】:

      猜你喜欢
      • 2014-10-09
      • 2011-06-11
      • 1970-01-01
      • 1970-01-01
      • 2012-06-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多