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