Создать дополнительные поля в записи Clojure?

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

Ответ 1

defrecord объявляет тип и конструктор, но тип реализует интерфейс карты clojure. Вам просто нужно поместить обязательные поля в декларацию. Например,

(defrecord MyRecord [required1 required2])

(defn make-my-record [r1 r2 & [opt1 opt2]]
  (assoc (MyRecord. r1 r2) :optional1 opt1 :optional2 opt2))

Может использоваться как

user> (make-my-record 1 2)
#:user.MyRecord{:required1 1, :required2 2, :optional2 nil, :optional1 nil}
user> (make-my-record 1 2 :a :b)
#:user.MyRecord{:required1 1, :required2 2, :optional2 :b, :optional1 :a}