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.
Byłoby świetnie, gdyby można było zgłosić raport o błędzie na ASYNC Jira http://dev.clojure.org/jira/browse/ASYNC –
Chciałem tylko upewnić się, że to błąd, a nie moje niewłaściwe wykorzystanie biblioteki. Złożę błąd. –
Zgłosiłem problem: http://dev.clojure.org/jira/browse/ASYNC-99 –