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

欢迎!请查阅关于页面以了解有关此操作的一些更多信息。

0
规范
由于缺乏一种统一的方式来找出规范是由哪些“子规范”组成的,因此目前有些对规范的操作难以实现。例如

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

例如,给定


(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/6cfe6809beeeea3246679e904372cca0
2. 规范形式规范(CLJ-2112)目前尚未可用,但可以用来获取规范解析表示形式,虽然仍需一些处理,但至少有已知的形式。

* 建议:

增加一种机制来获取规范所组成的“子规范”。每个规范实现可以选择如何以适当的方式实现此机制。

3 个答案

0

评论者:ericnormand

我忘记添加这个建议了

建议

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

0

评论由:alexmiller 提出

重新编写了标题和一些描述,使其更少依赖于实现细节(可能发生变化),更多地描述当前的问题。

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