Supponiamo che io ho due protocolli:Come si può estendere un protocollo Clojure ad un altro protocollo?
(defprotocol A
(f [this]))
(defprotocol B
(g [x y]))
E voglio estendere il protocollo B a tutte le istanze che supportano il protocollo A:
(extend-protocol A
String
(f [this] (.length this)))
(extend-protocol B
user.A
(g [x y] (* (f x) (f y))))
La motivazione principale è quello di evitare di dover estendere la B a parte a tutti le possibili classi che A può essere estesa a, o anche a future classi sconosciute che altre persone possono estendere A (immaginiamo se A fosse parte di un'API pubblica, per esempio).
Tuttavia questo non funziona - si ottiene qualcosa di simile al seguente:
(g "abc" "abcd")
=> #<IllegalArgumentException java.lang.IllegalArgumentException:
No implementation of method: :g of protocol: #'user/B found for
class: java.lang.String>
Questo è possibile a tutti? In caso contrario, c'è una soluzione ragionevole per raggiungere lo stesso obiettivo?
Grazie. Penso che questo sia l'approccio migliore nel mio caso: l'analogia con la libreria delle sequenze funziona bene qui! – mikera