当协议调用表包含<!时,core.async go block无法编译 宏(multimethod' -item-to-ssa'无法调度:protocol-invoke)

Val*_*nck 5 macros compilation clojure multimethod core.async

go当我偶然发现一个奇怪的编译错误时,我正在实现一个涉及core.async 块的函数:

CompilerException java.lang.IllegalArgumentException: 
No method in multimethod '-item-to-ssa' for dispatch value: :protocol-invoke, 
compiling:(NO_SOURCE_PATH:2:3) 
Run Code Online (Sandbox Code Playgroud)

我尝试了一点尝试去除问题,发现它非常通用.说我有任何协议MyProtocol:

(defprotocol MyProtocol
  (do-something [this param] "some method"))
Run Code Online (Sandbox Code Playgroud)

以下代码将无法编译,失败,上面显示的异常:

(defn uncompilable! [me ch] 
  (go 
    (do-something me (<! ch)) ;; apparently, it hurts to use <! in a protocol method invocation 
    ))
Run Code Online (Sandbox Code Playgroud)

但是,以下2将编译没有任何问题:

(defn compilable! [me ch] 
  (let [call-it #(do-something me %)] ; wrapping the protocol call in a function
    (go 
     (call-it (<! ch))
     )))

(defn compilable-2! [me ch] 
  (go 
    (let [my-value (<! ch)] ; taking out the <! call
      (do-something me my-value))
    ))
Run Code Online (Sandbox Code Playgroud)

显然,这与-item-to-ssa多方法有关,而不是在 clojure.core.async.impl.ioc-macros命名空间中.

在我看来," <!内部协议方法调用形式"是go宏无法处理的情况.

有人对此有解释吗?我应该提交错误吗?


这发生了使用[org.clojure/core.async "0.1.346.0-17112a-alpha"]和两者[org.clojure/clojure "1.7.0-alpha1"][org.clojure/clojure "1.6.0"].

仅供参考,当我实施Ring-type中间件与http-kit异步Web服务器和core.async结合时,就会发生这种情况.

Val*_*nck 0

正如 Nathan Davis 评论的那样,这个问题从 core.async 0.2.374 开始就已修复。