В Clojure настолько мощно то, что все основные типы данных реализуют одну и ту же абстракцию последовательности: clojure.lang.ISeq.
Это означает, что такие функции, как «first», «concat», «cons», «map», «rest» и т. Д., Работают в общем для всех этих типов данных.
У меня такой вопрос: как я могу добавить свою собственную пользовательскую функцию в микс и заставить ее работать для всех типов, которые выходят из ISeq?
Одна из первых попыток состояла в том, чтобы определить мой собственный протокол, затем "(расширенный тип clojure.lang.ISeq ...", но это не сработало (компилируется, но не добавляет поведение к фактическим типам) Другая идея состояла в том, чтобы написать макрос, который явно «продлевает тип» явно для всех типов Clojure (PersistentHashMap, PersistentList и т. Д.), Но это кажется хитрым.
Есть ли какой-нибудь элегантный / идиоматический способ сделать это? Может быть, мультиметоды?