перегрузка карты хеша clojure в транзакции STM - PullRequest
1 голос
/ 31 декабря 2010

Я хочу использовать clojure STM для хранения данных для моего приложения, но чтобы структура данных невидимо сохраняла структуру в хранилище данных.как я могу расширить встроенные типы с помощью своей собственной функциональности, чтобы пользователь API не знал.

обратите внимание, что я хочу использовать все стандартные вызовы clojure, чтобы манипулировать структурами данных, тем самым делая вызывающегоAPI не знает.это вообще возможно?

Ответы [ 2 ]

2 голосов
/ 31 декабря 2010

Не уверен, так ли это, но вы можете расширить интерфейсы (протоколы) с 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).Для всех операций чтения должно быть достаточно просто пройти через функции реальной карты в качестве реализации.

1 голос
/ 31 декабря 2010

deftype предназначен для создания новых вещей типа структуры данных, но я не уверен, что вы сможете достичь этих целей, пока не произойдет больше Clojure-in-Clojure и протоколов i-izing внутренних компонентов Clojure.Я хотел бы быть неправым, хотя.:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...