2010-03-19 49 views
7

Clojure结构可以任意扩展,增加新的字段。我可以将字段添加到clojure类型吗?

是否有可能以类似的方式扩展类型(使用deftype创建)?

编辑:为了未来的访问者的利益,正如Brian在下面指出的那样,此功能可能会发生变化。

+0

deftype仍然是一项正在进行的工作,事情可能会发生变化。见例如http://groups.google.com/group/clojure/browse_frm/thread/a8b4a1a00fe8d0f2/2ff645127490228b – 2010-03-19 16:56:59

+0

谢谢,该线程有帮助。 – 2010-03-19 17:29:19

回答

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从此分裂类型的语义为defrecorddeftype。对于大多数应用程序级编程,您需要使用记录。方便地,他们自动提供clojure.lang.IPersistentMap的实现,没有必要的魔法。

+1

我喜欢神奇的东西。感谢你的回答。 – 2010-03-19 17:18:44

+0

这在Clojure 1.2中不起作用,你会得到一个java.lang.AbstractMethodError,就像你期望的那样,不提供任何实现。 – 2011-01-14 05:54:08

+0

这对于Clojure 1.2的早期beta版本是有效的。我在最终版本中添加了一条提及更改的注释。 – 2011-01-14 21:55:02

相关问题