Reputation: 14459
Clojure structs can be arbitrarily extended, adding new fields.
Is it possible to extend types (created using deftype) in a similar way?
EDIT: For the benefit future visitors, as Brian pointed out below, this feature is subject to change.
Upvotes: 7
Views: 716
Reputation: 3363
Actually you can treat types as maps, you just need to extend clojure.lang.IPersistentMap (an implementation is magically supplied).
(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}
Note
Clojure has since split the semantics of types into defrecord
and deftype
. For most application-level programming, you'll want to use records. Conveniently, they automatically provide an implementation of clojure.lang.IPersistentMap
, no magic necessary.
Upvotes: 7