2011-08-23 19 views
7

Defrecord support named parameters? es decir, si si tengo algo como esto:clojure defrecord nombrado parámetros?

(defrecord Person [name age]) 

¿Puedo hacer algo como esto:

(Person. {:age 99 :name "bob"}) 
(Person. :age 99 :name "bob") 

La única cosa que veo por google es cosas como esta:

(Person. "bob" 99) 

Qué parece menos claro ...

+3

Agregado en Clojure 1.3, defrecord crea automáticamente un constructor que toma un mapa llamado p. map-> Persona Ver http://dev.clojure.org/display/design/defrecord+improvements –

Respuesta

0

Actualmente no.

pero usted puede olvidarse de nombrar los parámetros y utilizar un mapa de extensión:

(defrecord Person []) 

(Person. nil {:age 99 :name "bob"}) 

Personalmente considero que esta es la manera más fácil de utilizar registros cuando se tiene un gran número de posibles campos.

+0

ok ... pero ¿qué está haciendo el nil antes del mapa? – Kevin

+0

es para metadatos si lo desea ...... – mikera

+0

gracias, marcaré esto como la respuesta correcta, ya que parece ser la solución más razonable. – Kevin

4

No incorporado, pero se puede usar algo como:

(defmulti make-instance (fn [class & rest] class)) 
(defmacro defrecord* [record-name fields] 
    `(do 
    (defrecord ~record-name ~fields) 
    (defmethod make-instance (quote ~record-name) [_# & {:keys ~fields}] 
     (new ~record-name [email protected])))) 
(defrecord* Person [name age]) 
(make-instance 'Person :age 99 :name "bob") 

No sabe cómo adecuado que sería por lo que quieres.

Cuestiones relacionadas