2010-03-19 7 views
7

Clojure-Strukturen können beliebig erweitert werden, indem neue Felder hinzugefügt werden.Kann ich Felder zu Clojure-Typen hinzufügen?

Ist es möglich, Typen (erstellt mit deftype) in ähnlicher Weise zu erweitern?

BEARBEITEN: Zum Vorteil zukünftiger Besucher, wie Brian unten hingewiesen hat, unterliegt diese Funktion Änderungen.

+0

deftype ist immer noch in Arbeit, Dinge können sich ändern. Siehe z.B. http://groups.google.com/group/clojure/browse_frm/thread/a8b4a1a00fe8d0f2/2ff645127490228b –

+0

Danke, dieser Thread hilft. –

Antwort

7

Eigentlich können Sie Arten als Karten behandeln, Sie müssen nur clojure.lang.IPersistentMap erweitern (eine Implementierung wird magisch geliefert).

(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} 

Hinweis

Clojure hat gespalten, da die Semantik von Typen in defrecord und deftype. Für die meisten Programme auf Anwendungsebene sollten Sie Datensätze verwenden. Praktischerweise stellen sie automatisch eine Implementierung von clojure.lang.IPersistentMap bereit, keine Magie notwendig.

+1

Ich mag magisch gelieferte Dinge. Danke für die Antwort. –

+0

Dies funktioniert nicht in Clojure 1.2, Sie erhalten nur einen java.lang.AbstractMethodError, wie Sie es erwarten würden, ohne irgendeine Implementierung bereitzustellen. –

+0

Dies war für eine frühe Beta-Version von Clojure 1.2 gültig. Ich habe einen Hinweis hinzugefügt, um die Änderungen in der endgültigen Version zu erwähnen. –

Verwandte Themen