clojure defrecord命名参数?

时间:2011-08-23 00:16:58

标签: clojure

defrecord是否支持命名参数?即如果我有这样的东西:

(defrecord Person [name age])

我可以这样做:

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

我通过谷歌搜索看到的唯一一件事就是这样:

(Person. "bob" 99)

这似乎不太清楚......

3 个答案:

答案 0 :(得分:4)

不是内置的,但你可以使用类似的东西:

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

不确定你想要的是多么合适。

答案 1 :(得分:2)

答案 2 :(得分:0)

目前不是。

但是你可以忘记命名参数并使用扩展名映射:

(defrecord Person [])

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

我个人认为,当你有大量可能的字段时,这是使用记录的最简单方法。