可以任意扩展Clojure结构,添加新字段。
是否可以以类似的方式扩展类型(使用deftype创建)?
编辑:对于未来访客的好处,正如布莱恩在下面指出的,这个功能可能会有所变化。
答案 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
的实现,没有必要的魔法。