Метапрограммирование со значениями clojure.spec?

Я пробовал clojure.spec, и у меня есть одна идея, как его использовать, — создать пользовательский интерфейс для редактирования экземпляра карты, которую я указываю. Например, он может сгенерировать веб-форму с полем выбора даты для ключа, указанного как дата, и тому подобное.

В библиотеке есть метод get-spec, но вроде нет функций, оперирующих спецификациями-как-значениями так, как мне нужно. Есть ли способ сделать что-то вроде спецификации карты и вернуть необходимые ключи для этой карты в виде вектора? Является ли такое метапрограммирование спецификациями за пределами предполагаемого варианта использования clojure.spec?


person Derek Thurn    schedule 15.01.2017    source источник


Ответы (1)


Метапрограммирование со спецификациями определенно входит в предполагаемый вариант использования clojure.spec.

Мы еще не выпустили (но написали и собираемся) спецификации для самих форм спецификаций. С их помощью можно согласовать саму форму спецификации и получить обратно структуру данных, представляющую спецификацию, которую можно использовать, например, для получения необходимых ключей из спецификации карты.

Соответствие спецификации ::spec может выглядеть примерно так:

user=> (s/def ::name string?)
:user/name
user=> (s/def ::m (s/keys :req [::name]))
:user/m
user=> (s/conform ::spec (s/form ::m))
[:form {:s clojure.spec/keys, :args {:req [[:key :user/name]]}}]

Затем вы можете вытащить набор ключей из этой структуры.

person Alex Miller    schedule 16.01.2017
comment
Отлично, я рад слышать, что это запланированная функция — я могу придумать несколько способов, в которых она была бы весьма полезна! - person Derek Thurn; 19.01.2017