Могу ли я добавить поля в типы clojure? - PullRequest
7 голосов
/ 19 марта 2010

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

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

РЕДАКТИРОВАТЬ: Для удобства будущих посетителей, как указал Брайан ниже, эта функция может быть изменена.

1 Ответ

7 голосов
/ 19 марта 2010

На самом деле вы можете рассматривать типы как карты, вам просто нужно расширить 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, никакой магии не требуется.

...