У меня есть спецификация DSL, которая представляет собой последовательность, как обычно (cat
). Я хочу воспользоваться анализом spec (т. Е. conform
ing), чтобы получить AST выражения, которое соответствует моему DSL. Например.Характеристики совместимых спецификаций/AST
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
говорится: «нет поддержки встроенной спецификации значения по дизайну»./«Это (принудительное) мнение о том, что спецификация значений, связанных с ключевым словом namespaced, например: 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, которую она создает (фактически лично я бы понял, что это то, что она должна делать). Какие-либо предложения?
Да, я так и думал, спасибо. Вы подразумеваете, что все решение Рича, если да, и если я могу спросить, кто-нибудь когда-нибудь приносил это ему? Думаю, это того стоило. – MasterMastic
Я не слышал, чтобы Рич обсуждал эту идею. –
Вижу, большое спасибо за вашу помощь! – MasterMastic