clojure отменить именованные параметры? - PullRequest
7 голосов
/ 23 августа 2011

Поддерживает ли defrecord именованные параметры?то есть, если у меня есть что-то вроде этого:

(defrecord Person [name age])

Могу ли я сделать что-то вроде этого:

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

Единственное, что я вижу, прибегая к помощи, - это такие вещи:

(Person. "bob" 99)

Что кажется менее ясным ...

Ответы [ 3 ]

4 голосов
/ 23 августа 2011

Не встроен, но вы можете использовать что-то вроде:

(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 ~@fields))))
(defrecord* Person [name age])
(make-instance 'Person :age 99 :name "bob")

Не уверен, насколько это подходит для того, что вы хотите.

2 голосов
/ 23 августа 2011

Похоже, это еще не поддерживается clojure?

http://david -mcneil.com / post / 765563763 / расширенные записи clojure

0 голосов
/ 24 августа 2011

В настоящее время нет.

Но вы можете просто забыть о именовании параметров и использовать карту расширений:

(defrecord Person [])

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

Лично я считаю, что это самый простой способ использовать записи, когда у вас есть большое количество возможных полей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...