Взаимосвязанные дефтипы в Clojure - PullRequest
6 голосов
/ 19 июня 2011

Я хочу реализовать transient и persistent! в моем типе Clojure. Насколько я могу судить, это означает, что еще один deftype, TransientMyThing, реализует необходимые методы. Хорошо, пока, но эти два класса должны знать друг о друге, чтобы возвращать экземпляры друг друга.

Я думаю, что могу сделать это, предварительно объявив функции Clojure make-transient и make-persistent, затем определив deftype (ссылаясь на эту функцию), затем реализовав функции с уже существующими типами, но это выглядит довольно брутто для меня. Есть ли лучший вариант?

Редактировать: это работает, но все равно брутто.

1 Ответ

4 голосов
/ 07 октября 2014

В Clojure 1.3 и более поздних версиях несколько более простое решение - полагаться на функции конструктора, которые Clojure создает для ваших типов, -> transient и -> persistent !. Так как это функции, а не макросы, вы можете их объявить. Тогда вы можете использовать их, а не свои собственные make-transient и make-persistent, и вам не нужно реализовывать их самостоятельно.

...