Macros 当协议调用表单包含<;时,core.async go块无法编译;!宏(多方法';-项到ssa';can';t调度on:协议调用)
我在实现一个涉及core.asyncMacros 当协议调用表单包含<;时,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
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,链接的问题被关闭为“不可复制”。因此,该问题现在似乎已修复,应该关闭该问题。