Macros 当协议调用表单包含<;时,core.async go块无法编译;!宏(多方法';-项到ssa';can';t调度on:协议调用)

Macros 当协议调用表单包含<;时,core.async go块无法编译;!宏(多方法';-项到ssa';can';t调度on:协议调用),macros,clojure,compilation,core.async,multimethod,Macros,Clojure,Compilation,Core.async,Multimethod,我在实现一个涉及core.asyncgo块的函数时,偶然发现了一个奇怪的编译错误: CompilerException java.lang.IllegalArgumentException: No method in multimethod '-item-to-ssa' for dispatch value: :protocol-invoke, compiling:(NO_SOURCE_PATH:2:3) 我做了一点实验,试图解决这个问题,发现它非常通用。假设我有任何协议MyProtoc

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

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 
    ))
(defn不可编译![me ch]
(去
)帮我做点什么(
但是,以下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))
    ))
(defn可编译![me ch]
(让我们[调用它#(对我做点什么]));将协议调用包装到函数中
(去
(叫它(
显然,这与ssa的
-item
多重方法有关,而不是在名称空间中

在我看来,“
内部协议方法调用表单”是
go
宏无法处理的情况

有人对此有解释吗?我应该提交一个bug吗?


这是使用
[org.clojure/core.async“0.1.346.0-17112a-alpha”]
[org.clojure/clojure“1.7.0-alpha1”]
[org.clojure/clojure“1.6.0”]
实现的


仅供参考,这是在我实现一个环形中间件将http工具包async web服务器和core.async结合起来时发生的。

正如Nathan Davis评论的那样,这在core.async 0.2.374中是固定的。

如果你能提交一份关于async的错误报告,那就太好了。Jira只是想确保这是一个错误,而不是我对库的滥用。我会将错误提交到.Filed该问题:我在Apache Storm Spoute定义中尝试使用
nextTuple
方法中的
go
时遇到类似问题。对于更高版本的core.async,链接的问题被关闭为“不可复制”。因此,该问题现在似乎已修复,应该关闭该问题。