2014-10-23 9 views
5

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.

+0

Sarebbe bello se potessi presentare una segnalazione di bug su ASYNC Jira http://dev.clojure.org/jira/browse/ASYNC –

+0

Volevo solo assicurarmi che fosse un bug, non il mio abuso della libreria. Inserirò il bug. –

+3

Archiviato il problema: http://dev.clojure.org/jira/browse/ASYNC-99 –

risposta

0

Come ha commentato Nathan Davis, questo problema è stato risolto in core.async 0.2.374.