Clojure结构可以任意扩展,增加新的字段。我可以将字段添加到clojure类型吗?
是否有可能以类似的方式扩展类型(使用deftype创建)?
编辑:为了未来的访问者的利益,正如Brian在下面指出的那样,此功能可能会发生变化。
Clojure结构可以任意扩展,增加新的字段。我可以将字段添加到clojure类型吗?
是否有可能以类似的方式扩展类型(使用deftype创建)?
编辑:为了未来的访问者的利益,正如Brian在下面指出的那样,此功能可能会发生变化。
其实你可以把类型视为地图,你只需要扩展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
的实现,没有必要的魔法。
我喜欢神奇的东西。感谢你的回答。 – 2010-03-19 17:18:44
这在Clojure 1.2中不起作用,你会得到一个java.lang.AbstractMethodError,就像你期望的那样,不提供任何实现。 – 2011-01-14 05:54:08
这对于Clojure 1.2的早期beta版本是有效的。我在最终版本中添加了一条提及更改的注释。 – 2011-01-14 21:55:02
deftype仍然是一项正在进行的工作,事情可能会发生变化。见例如http://groups.google.com/group/clojure/browse_frm/thread/a8b4a1a00fe8d0f2/2ff645127490228b – 2010-03-19 16:56:59
谢谢,该线程有帮助。 – 2010-03-19 17:29:19