当我偶然发现一个奇怪的编译错误时,我正在实现一个涉及core.async go块的函数: CompilerException java.lang.IllegalArgumentException: No method in multimethod '-item-to-ssa' for dispatch value: :protocol-invoke, com
CompilerException java.lang.IllegalArgumentException: No method in multimethod '-item-to-ssa' for dispatch value: :protocol-invoke, compiling:(NO_SOURCE_PATH:2:3)
我尝试了一点尝试去除问题,发现它非常通用.说我有任何协议MyProtocol:
(defprotocol MyProtocol (do-something [this param] "some method"))
以下代码将无法编译,失败,上面显示的异常:
(defn uncompilable! [me ch] (go (do-something me (<! ch)) ;; apparently, it hurts to use <! in a protocol method invocation ))
但是,以下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)) ))
显然,这与-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结合时,就会发生这种情况.
正如内森戴维斯所评论的那样,这是固定的,因为core.async 0.2.374.