Załóżmy, że mam dwa protokoły:Jak można rozszerzyć protokół Clojure na inny protokół?
(defprotocol A
(f [this]))
(defprotocol B
(g [x y]))
I chcę przedłużyć Protokół B do wszystkich instancji, które obsługują protokół A:
(extend-protocol A
String
(f [this] (.length this)))
(extend-protocol B
user.A
(g [x y] (* (f x) (f y))))
Podstawową motywacją jest, aby uniknąć konieczności przedłużenia B osobno dla wszystkich możliwe klasy, które można rozszerzyć na, lub nawet na nieznane przyszłe klasy, które inni mogą rozszerzyć A (na przykład, jeśli A był częścią publicznego interfejsu API).
Jednak to nie działa - można dostać coś jak następuje:
(g "abc" "abcd")
=> #<IllegalArgumentException java.lang.IllegalArgumentException:
No implementation of method: :g of protocol: #'user/B found for
class: java.lang.String>
Czy to w ogóle możliwe? Jeśli nie, czy istnieje rozsądne obejście dla osiągnięcia tego samego celu?
Dzięki. Myślę, że to najlepsze podejście w moim przypadku - analogia z biblioteką sekwencji działa tutaj dobrze! – mikera