2010-03-19 50 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

相關問題