我有一个DSL规范,这是一个像往常一样的序列(cat)。我想利用规范的解析(即conforming)来获得符合我的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的文档说:“通过设计,不支持内联值规范。”/“规范的(强制)意见是,与命名空间关键字相关联的值的规范应该在该关键字本身下注册。”因此,复制(省略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的规范(实际上,我个人认为这是它应该做的事情)。有什么建议吗?
发布于 2017-01-17 15:20:53
我想说,现在你有两个选择-一个是做你正在做的事情,并为前/后创建两组规范。
另一种选择是在数据中创建一个域模型,并生成这两种规范(我见过许多人正在做类似的事情)。
我没有听说过Rich关于生成一致结果的输出规范,所以我不认为这在当前的路线图中是可能的。
https://stackoverflow.com/questions/41686718
复制相似问题