2014-10-23 10 views
5

byłem realizuje funkcję udziałem core.async go blok, gdy natknąłem się na dziwny błąd kompilacji:core.async go block nie kompiluje się, gdy formularz wywoływania protokołu zawiera <! makro (punkt A 'do SSA' nie może wywoływać na multimethod: protokół-invoke)

CompilerException java.lang.IllegalArgumentException: 
No method in multimethod '-item-to-ssa' for dispatch value: :protocol-invoke, 
compiling:(NO_SOURCE_PATH:2:3) 

Eksperymentowałem trochę, próbując rozwiązać problem i odkryłem, że jest bardzo ogólny. Że mam żadnego protokołu MyProtocol:

(defprotocol MyProtocol 
    (do-something [this param] "some method")) 

Poniższy kod nie zostanie skompilowany, w przeciwnym razie z wyjątkiem pokazałem powyżej:

(defn uncompilable! [me ch] 
    (go 
    (do-something me (<! ch)) ;; apparently, it hurts to use <! in a protocol method invocation 
    )) 

Jednak po 2 skompiluje bez problemu:

(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)) 
    )) 

Podobno ma to związek z multimethod -item-to-ssa niż można znaleźć w clojure.core.async.impl.ioc-macros namespace.

Wydaje mi się, że "formularz inwokacji metody protokołu w protokole wewnętrznym" <! nie jest w stanie obsłużyć makra go.

Czy ktoś ma wyjaśnienie na ten temat? Czy powinienem zgłosić błąd?


Stało się to za pomocą [org.clojure/core.async "0.1.346.0-17112a-alpha"] i zarówno [org.clojure/clojure "1.7.0-alpha1"] i [org.clojure/clojure "1.6.0"].

FYI, stało się to, gdy wdrażałem oprogramowanie pośrednie typu Ring, aby ożenić się z http-kit async web server i core.async.

+0

Byłoby świetnie, gdyby można było zgłosić raport o błędzie na ASYNC Jira http://dev.clojure.org/jira/browse/ASYNC –

+0

Chciałem tylko upewnić się, że to błąd, a nie moje niewłaściwe wykorzystanie biblioteki. Złożę błąd. –

+3

Zgłosiłem problem: http://dev.clojure.org/jira/browse/ASYNC-99 –

Odpowiedz

0

Jak skomentował Nathan Davis, jest to poprawione z core.async 0.2.374.

Powiązane problemy