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