我最近一直在尝试 Clojure 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
我认为这可能是从规范/和文档字符串故意的:
采用谓词/规范形式,例如
(s/甚至?#(< % 42))
返回一个规范,该规范返回符合的值。连续一致的值通过其余谓词传播。
但这对我来说似乎违反直觉,因为它会妨碍规范谓词的重用,因为需要编写它们以接受“[<or branch> <actual value>]”。
如果您有多个规范/或分支,情况会变得更糟:
(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
我在这里错过了一些基本的东西吗?