最近我一直在尝试使用Clojure Spec并遇到了一个意外的错误信息。我发现,如果您在spec/and中嵌套了spec/or,则在spec/or分支之后,spec函数将传递一个已确认的值而不是顶层值。
您可以在这里看到“v”的打印值(虚构的示例):
(spec/valid? (spec/and (spec/or :always-true (constantly true))
(fn [v]
(println "v:" v)
(constantly true)))
nil)
v: [:always-true nil]
=> true
我认为这可能是从spec/and的文档字符串中有意为之:
接受谓词/spec-forms,例如: (s/and even? #(<% 42)) 返回一个规范化值的规范。连续的规范化值会通过其余的谓词传播。
但是我认为这似乎与直觉相反,因为它会妨碍规范谓词的重用,因为它们需要编写以接受“[ ]”。
如果您有多个spec/or分支,则情况会变得更糟。
(spec/valid? (spec/and (spec/or :always-true (constantly true))
(spec/or :also-always-true (constantly true))
(fn [v]
(println "v:" v)
(constantly true)))
nil)
v: [:also-always-true [:always-true nil]]
=> true
我在这里错过了什么基本的东西吗?
s/nonconforming
代替conformer。 - glts