Добавление настраиваемого поведения к последовательностям Clojure

Отчасти мощная сила Clojure состоит в том, что все основные типы данных реализуют одну и ту же абстракцию последовательности: clojure .lang.ISeq.

Это означает, что такие функции, как «first», «concat», «cons», «map», «rest» и т. д., работают в общем со всеми этими типами данных.

Мой вопрос: это: как я могу добавить свою собственную функцию в микс и заставить ее работать для всех типов, которые являются наследниками ISeq?

Первой попыткой было определить мой собственный протокол, а затем "(extension-type clojure.lang. ISeq ... ", но это не работает (он компилируется, но не добавляет поведение к фактическим типам). Другая идея заключалась в том, чтобы написать макрос, который явно выполняет" расширенный тип "для всех типов Clojure ( PersistentHashMap, PersistentList и т. Д.), Но это кажется беспорядочным.

Есть ли какой-нибудь изящный / идиоматический способ сделать это? Возможно, мультиметоды?

6
задан AgentLiquid 16 September 2011 в 02:45
поделиться