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

欢迎!请查阅关于页面以获取更多关于这方面的信息。

+2

重新标记了

在 specs alpha 2 中,如果我们定义一个 clojure.alpha.spec/select 的 spec,该 spec 是一个嵌套 spec,它本身也是 s/schema,但键是不带命名空间的,并尝试使用 s/valid?s/exercise,我们会得到异常
s/valid 抛出 *"未找到类 clojure.lang.Keyword 方法: :conform 的实现,属于协议: #'clojure.alpha.spec.protocols/Spec",而 s/exercise 抛出 "无法解析 spec::foo"**(其中 :foo 是不带命名空间的键)。

一个例子可以更好地说明问题

; Context
(s/def ::foo int?)
(s/def ::inner (s/schema [{:foo ::foo}]))
(s/def ::outer (s/schema [::inner]))

; Works as expected:
(s/exercise ::outer)
(s/exercise (s/select ::inner [*]))
(s/valid? (s/select ::inner [*]) {:foo 10})

; Fails with "Unable to resolve spec: :foo"
(s/exercise (s/select ::outer [*]))

; Fails with "No implementation of method: :conform* of protocol: #'clojure.alpha.spec.protocols/Spec found for class: clojure.lang.Keyword"
(s/valid? (s/select ::outer [*]) {::inner {:foo 10}})

2 个答案

+1

我的第一反应是 "Spec 2 还未准备好使用,有很多 bug",正如 Alex 在关于 Spec 2 的多数问题中的回复所说。

我预计 ::inner 的语法应该是
(s/def ::inner (s/schema {:foo ::foo}))
根据维基文档,但这也不起作用(所以我回到了 "它是 Spec 2 目前的一些 bug 之一")。

...