【发布时间】:2014-11-20 08:45:41
【问题描述】:
我是 clojure core.async 库的新手,我正在尝试通过实验来理解它。
但是当我尝试时:
(let [i (async/chan)] (async/go (doall (for [r [1 2 3]] (async/>! i r)))))
它给了我一个非常奇怪的例外:
CompilerException java.lang.IllegalArgumentException: No method in multimethod '-item-to-ssa' for dispatch value: :fn
我尝试了另一个代码:
(let [i (async/chan)] (async/go (doseq [r [1 2 3]] (async/>! i r))))
它根本没有编译器异常。
我完全糊涂了。发生了什么?
【问题讨论】:
-
for在 clojure 中 不是 循环 - 它是列表理解。考虑到这一点,您的for示例不是调用副作用>!函数的惯用方式。也许编译器消息可以/应该改进,但您的根本问题是以这种方式使用for没有(clojure)意义。doseq非常好。 -
>!块,它等待有人从频道读取。尝试先设置阅读部分,或者使用put!
-
@edbond 哇,这确实有效.. 但我更困惑,Timothy Baldridge 刚才不是说 async/go 不能在
async/go块中处理fn吗?跨度>
标签: clojure core.async