Ответ 1
Примеры поддержки полных и частичных функций конструктора записи и поддержки для отображаемых форм печати и печати:
- http://david-mcneil.com/post/765563763/enhanced-clojure-records
- http://github.com/david-mcneil/defrecord2
Дэвид - мой коллега, и мы широко используем этот defrecord2 в нашем проекте. Я думаю, что что-то вроде этого действительно должно быть частью ядра Clojure (подробности могут значительно варьироваться, конечно).
То, что мы считаем важным:
- Возможность построения записи с именованными (возможно, частичными) параметрами: (new-foo {: a 1})
- Возможность создания записи путем копирования существующей записи и внесения изменений: (new-foo old-foo {: a 10})
- Проверка поля - если вы передаете поле за пределами объявленных полей записи, введите ошибку. Конечно, это действительно законно и потенциально полезно, поэтому есть способы сделать его необязательным. Так как это было бы редко в нашем использовании, это скорее всего будет ошибкой.
- Значения по умолчанию - это было бы очень полезно, но мы его не реализовали. Chas Emerick написал о добавлении поддержки значений по умолчанию здесь: http://cemerick.com/2010/08/02/defrecord-slot-defaults/
- Поддержка печати и печати - нам очень полезно иметь записи и печать в форме, которая может быть возвращена к исходной записи. Например, это позволяет запускать тест, прокручивать фактический вывод, проверять его и использовать в качестве ожидаемого результата. Или проведите вывод из трассировки отладки и получите реальную форму, пригодную для использования.