2011-08-23 13 views
7

La defrecord supporta i parametri denominati? cioè se se ho qualcosa di simile:parametri di defrecord clojure denominati?

(defrecord Person [name age]) 

Posso fare qualcosa di simile:

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

L'unica cosa che vedo da googling è cose come questa:

(Person. "bob" 99) 

Quale sembra meno chiaro ...

+3

Aggiunto in Clojure 1.3, defrecord crea automaticamente un costruttore che prende una mappa chiamata per es. mappa-> Persona Vedere http://dev.clojure.org/display/design/defrecord+improvements –

risposta

0

Attualmente non disponibile.

ma si può solo dimenticare nominare i parametri e utilizzare una mappa di estensione:

(defrecord Person []) 

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

Personalmente trovo che questo sia il modo più semplice per utilizzare i record quando si dispone di un gran numero di possibili campi.

+0

ok ... ma che cosa fa il nil prima della mappa? – Kevin

+0

è per i metadati se lo vuoi ...... – mikera

+0

grazie, contrassegnerò questo come la risposta corretta poiché sembra la soluzione più ragionevole. – Kevin

4

Non integrato, ma si potrebbe usare qualcosa come:

(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") 

Non sono sicuro di come adatto che sarebbe per ciò che si vuole.

Problemi correlati