Не уверен, так ли это, но вы можете расширить интерфейсы (протоколы) с clojure.lang
.Вот очень минимальный пример добавления побочного эффекта (как вам нужно) к функции assoc
карты.
(deftype LolMap [m]
clojure.lang.IPersistentMap
(assoc [this k v] (do (println (str k " CAN HAS " v "!"))
(LolMap. (assoc m k v))))
clojure.lang.Seqable
(seq [this] (seq m)))
Тип просто оборачивает реальную карту, которую вы должны предоставитьправильные реализации для всех задействованных интерфейсов (IPersistentMap и Seqable - это минимум, чтобы иметь возможность создавать экземпляры и печатать экземпляр в REPL).Для всех операций чтения должно быть достаточно просто пройти через функции реальной карты в качестве реализации.