Clojure 为什么;断言失败:>;!不用于(go…)块“;
我试图在我的REPL中找出core.async,但我完全搞不清楚我的(go-loop…)用法如何不符合async/>的“go-block” 我的围棋圈就像Clojure 为什么;断言失败:>;!不用于(go…)块“;,clojure,core.async,Clojure,Core.async,我试图在我的REPL中找出core.async,但我完全搞不清楚我的(go-loop…)用法如何不符合async/>的“go-block” 我的围棋圈就像 (async/go-loop [page (range 3)] (if (empty? page) (async/close! ch) (dorun (map (fn [row] (println row) (async/>! ch row))
(async/go-loop [page (range 3)]
(if (empty? page)
(async/close! ch)
(dorun (map (fn [row]
(println row)
(async/>! ch row)) page)))
(recur (range (dec (count page)))))
但是REPL很沮丧
=>
#object[clojure.core.async.impl.channels.ManyToManyChannel
0x23465937
"clojure.core.async.impl.channels.ManyToManyChannel@23465937"]
0
Exception in thread "async-dispatch-12" java.lang.AssertionError: Assert failed: >! used not in (go ...) block
nil
...
为什么(go loop…
的范围不足以调用(async/>!row)
我应该在这里使用go循环吗?
>很遗憾,代码>和其他驻车调用不能在go
中嵌套的函数中使用
go
将您提供的代码转换为状态机并查找停车呼叫。但是,它不会查看嵌套函数的内部
发件人:
go块中不支持的构造和其他限制
go宏在函数创建边界处停止转换。这意味着以下代码将无法编译,或者可能只是抛出一个运行时错误,说明在go块之外使用了:
(go (let [my-fn (fn [] (<! c))]
(my-fn)))
(走(让[my fn(fn[](
这是一件需要记住的事情,因为许多Clojure构造在宏中创建函数。下面是一些无法正常工作的代码示例:
(go (map <! some-chan))
(go (for [x xs]
(<! x)))
(去(地图)
所以…(do seq…
)而不是(dorun(map…
)的尝试会让我摆脱嵌套函数异常?你可能已经猜到了…我对core.async有点陌生。@BobKuhar阅读了新的更新。找到了一个官方的源代码。注意,许多宏都会生成函数,所以这可能也救不了你。是的…(doseq[行页面]…
克服了嵌套函数的缺点,效果非常好。ThanksI根据您的帮助请求将代码块移到了引号中。我认为我做得不错,但请随意验证。作为参考,您只需要添加
(后面有一个空格)到代码块中的行的开头。@NathanDavis啊。谢谢。看起来好多了。Clojurescript-Uncaught错误的可能重复:@OlegTheCat答案可能是相同的,但不是完全相同的问题。就像2+5=7和8-1=7实际上不是同一个问题,尽管答案是相同的。再加一个way、 如果你对core.async非常熟悉,这可能看起来像是同一个问题,但对新来的人来说……比如说用谷歌搜索该异常消息,你在搜索该异常消息时不会遇到Clojurescript问题。