Если вы попытаетесь запустить следующий код, вы увидите, что он будет компилироваться, но не выполняется во время выполнения во второй-последней строке из-за «Нет метода протокола NameSayer.say- имя, определенное для типа cljs.core/PersistentArrayMap: {} ", хотя оно удовлетворяет? call возвращает true. Подобный сбой произошел бы для случая IVector/PersistentVector, несмотря на то, что он также удовлетворял требуемому протоколу.Как расширить протоколы для коллекций ClojureScript в общем случае
(defprotocol NameSayer
(say-name [input]))
(extend-protocol NameSayer
number
(say-name [_]
"I'm a number!")
string
(say-name [_]
"I'm a string!")
IMap
(say-name [_]
"I'm a map!")
IVector
(say-name [_]
"I'm a vector!"))
(println (satisfies? IMap {}))
(println (satisfies? IVector []))
(println (say-name "hello"))
(println (say-name 100))
(println (say-name {}]))
(println (say-name []))
я вокруг в слежения за ними clojurescript.core и увидел, что-то вроде IPrintWithWriter, реализации PersistentArrayMap, PersistentHashMap и PersistentTreeMap просто дублируются, несмотря на все имеющие общий интерфейс IMap. Есть ли лучший способ решить эту проблему, чем дублирование кода с использованием протоколов?