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

欢迎!请参阅关于页面,了解更多此平台的工作方式。

0
规范
由于目前没有找到统一的方法来确定一个规范(spec)由哪些“子规范”构成,所以有些对规范(spec)的操作目前很难实现。例如:

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

例如,给定:


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


然后有一种方法来确定::user的“子规范”,一个代码检查工具可以检查s/keys中的所有键是否都是已定义的规范(spec)。

**解决方案**:

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

**提议**:

添加一种机制来获取由规范(spec)组成的“子规范”。每个规范实现都可以选择以适当的方式实现这一机制。

3 答案

0

由ericnormand发表的评论:我忘记添加这个提议了。

提议

建议:

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

0

评论者:alesmiller

重写了标题和部分描述,使其更少依赖于实现细节(可能发生变化)以及更注重当前问题。

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