由于缺乏一种统一的方式来找出规范是由哪些“子规范”组成的,因此目前有些对规范的操作难以实现。例如
* 依赖分析
* 深度描述(显示顶级规范所使用的所有规范)
* 丢失或无效规范名称的检测
例如,给定
(s/def ::user-id int?)
(s/def ::user (s/keys :req [::userid])) ;; 注意拼写错误
(s/valid? ::user {::userid "Jim"}) ;; => true,但期望为false
并且确定 ::user 的“子规范”的方法,linter 可以检查 s/keys 中的所有键是否都是已定义的规范。
* 解决方案:
1. 可以使用 {{form}} 来获取原始规范形式,但之后必须进一步解释(并且缺少创建时所处原始的词法环境)。示例尝试:
https://gist.github.com/ericnormand/6cfe6809beeeea3246679e904372cca02. 规范形式规范(CLJ-2112)目前尚未可用,但可以用来获取规范解析表示形式,虽然仍需一些处理,但至少有已知的形式。
* 建议:
增加一种机制来获取规范所组成的“子规范”。每个规范实现可以选择如何以适当的方式实现此机制。