Спецификации для соответствующих спецификаций / AST

У меня есть спецификация DSL, которая, как обычно, представляет собой последовательность (cat). Я хочу воспользоваться синтаксическим анализом спецификации (т. е. conforming), чтобы получить AST выражения, которое соответствует моему DSL. Например.

user> (s/def ::person (s/cat :person-sym '#{person} :name string? :age number?))
=> :user/person
user> (s/conform ::person '(person "Henry The Sloth" 55))
=> {:person-sym person, :name "Henry The Sloth", :age 55}

Теперь, когда он проанализирован и у меня есть AST, я хотел бы сделать с ним интересные вещи, поэтому я хотел бы протестировать его и еще много чего. Итак, теперь мне нужно написать спецификацию для этого AST, а это практически все дублирует. На самом деле это хуже, потому что теперь мне нужно s/def спецификации для предикатов, которых раньше не было, потому что, как говорится в документации для keys: "нет поддержки спецификации встроенных значений по замыслу ." / «Это (принудительное) мнение спецификации о том, что спецификация значений, связанных с ключевым словом в пространстве имен, например :my.ns/k, должна быть зарегистрирована под самим этим ключевым словом..». Итак, дублирование (с опусканием части person-sym):

user> (s/def ::name string?)
=> :user/name
user> (s/def ::age number?)
=> :user/age
user> (s/def ::person-ast (s/keys :req-un [::name ::age]))
:user/person-ast

И теперь это кажется совместимым:

user> (s/conform ::person-ast (s/conform ::person '(person "Henry The Sloth" 55)))
=> {:person-sym person, :name "Henry The Sloth", :age 55}

На практике у меня, конечно, более сложные данные, и мне интересно, что мне делать? Спецификация AFAIK не дает мне спецификации для AST, который он создает (на самом деле лично я считаю, что это то, что он должен делать). Какие-либо предложения?


person MasterMastic    schedule 16.01.2017    source источник
comment
Рассматривали ли вы возможность использования спецификации/неформы для проверки соответствия значения спецификации? Кажется, что возникает исключение, если невозможно изменить значение, чтобы указать, было ли оно согласовано или нет.   -  person Rulle    schedule 03.11.2018


Ответы (1)


Я бы сказал, что прямо сейчас у вас есть два варианта: один — делать то, что вы делаете, и создавать два набора спецификаций до/после.

Другой вариант — создать модель вашего домена в данных и сгенерировать обе спецификации (я видел, что многие люди делают что-то подобное).

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

person Alex Miller    schedule 17.01.2017
comment
Да, я так и понял, спасибо. Вы намекаете, что все решает Рич, если да, то могу ли я спросить, кто-нибудь когда-нибудь доводил это до него? Я думаю, это того стоило бы. - person MasterMastic; 18.01.2017
comment
Я не слышал, чтобы Рич обсуждал эту идею. - person Alex Miller; 18.01.2017