プロトコル呼び出しフォームに<!が含まれていると、core.asyncgoブロックのコンパイルに失敗します。マクロ(multimethod'-item-to-ssa 'は:protocol-invokeでディスパッチできません)

Valentin Waeselynck

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を結合するためにリングタイプのミドルウェアを実装していたときに発生しました。

Valentin Waeselynck

Nathan Davisがコメントしたように、これはcore.async0.2.374で修正されています。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

Related 関連記事

ホットタグ

アーカイブ