mi è stato l'implementazione di una funzione che coinvolge un blocco core.async go
, quando mi sono imbattuto in uno strano errore di compilazione:Il blocco core.async go non riesce a compilare quando il modulo di chiamata del protocollo contiene <! macro (multimethod '-item-a-ssa' non può inviare on: protocollo-Invoke)
CompilerException java.lang.IllegalArgumentException:
No method in multimethod '-item-to-ssa' for dispatch value: :protocol-invoke,
compiling:(NO_SOURCE_PATH:2:3)
Ho provato un po 'a provare a rimuovere il problema e ho scoperto che era molto generico. Dire che ho qualsiasi protocollo MyProtocol
:
(defprotocol MyProtocol
(do-something [this param] "some method"))
Il seguente codice non viene compilato, non riuscendo ad eccezione vi ho mostrato sopra:
(defn uncompilable! [me ch]
(go
(do-something me (<! ch)) ;; apparently, it hurts to use <! in a protocol method invocation
))
Tuttavia, i seguenti 2 verrà compilato senza alcun problema:
(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))
))
a quanto pare, questo ha a che fare con la -item-to-ssa
multimethod che può essere trovato nella clojure.core.async.impl.ioc-macros spazio dei nomi.
Mi sembra che il '<!
modulo di chiamata del protocollo interno' sia una situazione che la macro go
non riesce a gestire.
Qualcuno ha una spiegazione a riguardo? Dovrei presentare un bug?
Questo è accaduto con [org.clojure/core.async "0.1.346.0-17112a-alpha"]
ed entrambi [org.clojure/clojure "1.7.0-alpha1"]
e [org.clojure/clojure "1.6.0"]
.
FYI, questo è successo quando stavo implementando un middleware di tipo Ring per sposare il server web async http-kit e core.async.
Sarebbe bello se potessi presentare una segnalazione di bug su ASYNC Jira http://dev.clojure.org/jira/browse/ASYNC –
Volevo solo assicurarmi che fosse un bug, non il mio abuso della libreria. Inserirò il bug. –
Archiviato il problema: http://dev.clojure.org/jira/browse/ASYNC-99 –