Clojure 为什么;断言失败:>;!不用于(go…)块“;

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))

我试图在我的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)) 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问题。