2010-03-19 18 views
7

Las estructuras de Clojure se pueden extender arbitrariamente, agregando nuevos campos.¿Puedo agregar campos a los tipos de clojure?

¿Es posible ampliar los tipos (creados con deftype) de forma similar?

EDITAR: para el beneficio de los futuros visitantes, como señaló Brian a continuación, esta función está sujeta a cambios.

+0

deftype sigue siendo un trabajo en progreso, las cosas están sujetas a cambios. Ver p. http://groups.google.com/group/clojure/browse_frm/thread/a8b4a1a00fe8d0f2/2ff645127490228b –

+0

Gracias, ese hilo ayuda. –

Respuesta

7

Actualmente puede tratar los tipos como mapas, solo tiene que extender clojure.lang.IPersistentMap (una implementación se suministra mágicamente).

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

Nota

Clojure desde entonces ha dividido la semántica de los tipos en defrecord y deftype. Para la mayoría de la programación a nivel de aplicación, querrá usar registros. Convenientemente, proporcionan automáticamente una implementación de clojure.lang.IPersistentMap, sin necesidad de magia.

+1

Me gustan las cosas mágicamente provistas. Gracias por la respuesta. –

+0

Esto no funciona en Clojure 1.2, obtendrá solo java.lang.AbstractMethodError, como era de esperar sin proporcionar ninguna implementación. –

+0

Esto fue válido para una versión beta temprana de Clojure 1.2. He agregado una nota para mencionar los cambios en la versión final. –

Cuestiones relacionadas