我有一个 DSL 规范,它是一个像往常一样的序列 ( cat
)。我想利用规范的解析(即conform
ing)来获得符合我的 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
所说:“设计上不支持内联值规范。” /“规范的(强制)意见是,与命名空间关键字相关的值的规范,如: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 的规范(实际上我个人认为这是它应该做的事情)。有什么建议么?