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)
問題を取り除くために少し実験したところ、非常に一般的であることがわかりました。私がプロトコルを持っているとしましょう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))
))
どうやら、これはclojure.core.async.impl.ioc-macros名前空間にある-item-to-ssa
マルチメソッドと関係があります。
「<!
プロトコルメソッド呼び出しフォーム内」は、go
マクロが処理できない状況であるように思われます。
誰かがこれについて説明がありますか?バグを報告する必要がありますか?
これは、[org.clojure/core.async "0.1.346.0-17112a-alpha"]
との両方[org.clojure/clojure "1.7.0-alpha1"]
を使用して発生しました[org.clojure/clojure "1.6.0"]
。
参考までに、これは、http-kit非同期Webサーバーとcore.asyncを結合するためにリングタイプのミドルウェアを実装していたときに発生しました。
Nathan Davisがコメントしたように、これはcore.async0.2.374で修正されています。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加