2024 年 Clojure 状态调查!中分享您的想法。

欢迎!有关该功能的更多信息,请参阅关于 页面。

0
规格
由于没有统一的方式来查找某个规格所组成的“子规格”,因此在规格上执行某些操作目前很难实现。以下是一些例子

* 依赖分析
* 深度描述(显示顶级规格使用的所有规格)
* 检测缺失或无效的规格名称

例如,给定


(s/def ::user-id int?)
(s/def ::user (s/keys :req [::userid])) ;; 注意拼写错误
(s/valid? ::user {::userid "Jim"}) ;; => true 但预期为 false


要确定 ::user 的“子规格”,可以使用一个检查器来检查 s/keys 中的所有键是否为已定义的规格。

**解决方案:**

1. 可以使用 {{form}} 来获取原始规格形式,但之后还需要进一步解释(并且缺少创建时原始的词法环境)。示例尝试:https://gist.github.com/ericnormand/6cfe6809beeeea3246679e904372cca0
2. 规格形式规格(CLJ-2112)尚不可用,但可以用来获取规格的解析表示,这将仍然需要一些处理,但至少会知道形式。

**提议:**

添加一种机制来获取组成规格的“子规格”。每个规格实现都可以根据需要选择如何以合适的方式实现这一机制。

3 个答案

0

评论者:ericnormand

我忘记添加这个建议了

建议

我建议我们向 Spec 协议添加一个 children* 方法。它应该返回一个直接引用的规格集合。该集合中的规格可以是关键字(如果通过名称引用),Spec 实例(对于嵌套规格),或其他可以作为规格的有效值(例如 fn)。

0

评论人:alexmiller

重写了标题和一些描述,使它们更加独立于实现细节(可能发生变化),更多地关注待解决的问题。

0
参考:https://clojure.atlassian.net/browse/CLJ-2208(由ericnormand报告)
...