2010-03-19 1 views
7

Структуры Clojure могут быть произвольно расширены, добавив новые поля.Могу ли я добавлять поля к типам clojure?

Возможно ли расширение типов (созданных с использованием deftype) аналогичным образом?

EDIT: для будущих посетителей, как указал Брайан, эта функция может быть изменена.

+0

deftype все еще находится в процессе разработки, все может быть изменено. См. http://groups.google.com/group/clojure/browse_frm/thread/a8b4a1a00fe8d0f2/2ff645127490228b –

+0

Спасибо, этот поток помогает. –

ответ

7

На самом деле вы можете рассматривать типы как карты, вам просто нужно расширить clojure.lang.IPersistentMap (реализация выполнена магически).

(deftype A [a b] 
    clojure.lang.IPersistentMap) 
(A 1 2) ;; => #:A{:a 1, :b 2} 
(assoc (A 1 2) :c 3) ;; => #:A{:a 1, :b 2, :c 3} 

Примечание

Clojure с тех пор расколе семантика типов в defrecord и deftype. Для большинства приложений на уровне программирования вы захотите использовать записи. Удобно, они автоматически обеспечивают реализацию clojure.lang.IPersistentMap, без магии.

+1

Мне нравятся волшебные вещи. Спасибо за ответ. –

+0

Это не работает в Clojure 1.2, вы получите просто java.lang.AbstractMethodError, как и следовало ожидать, без какой-либо реализации. –

+0

Это было актуально для ранней бета-версии Clojure 1.2. Я добавил примечание для упоминания изменений в финальной версии. –