У меня есть спецификация DSL, которая, как обычно, представляет собой последовательность (cat
). Я хочу воспользоваться синтаксическим анализом спецификации (т. е. conform
ing), чтобы получить 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, который он создает (на самом деле лично я считаю, что это то, что он должен делать). Какие-либо предложения?