Предположим, у меня есть два протокола:
(defprotocol A
(f [this]))
(defprotocol B
(g [x y]))
И я хочу расширить протокол B ко всем экземплярам, поддерживающим протокол A:
(extend-protocol A
String
(f [this] (.length this)))
(extend-protocol B
user.A
(g [x y] (* (f x) (f y))))
Основная мотивация заключается в том, чтобы избежать необходимости разделить B отдельно на все возможные классы, которые могут быть расширены до или даже неизвестными будущими классами, которые другие люди могут распространять на A (представьте, если A был частью публичного API, например).
Однако это не сработает - вы получите что-то вроде следующего:
(g "abc" "abcd")
=> #<IllegalArgumentException java.lang.IllegalArgumentException:
No implementation of method: :g of protocol: #'user/B found for
class: java.lang.String>
Возможно ли это вообще? Если нет, есть ли разумное обходное решение для достижения той же цели?