如果我理解 clojure.spec/fdef 正确,它允许我们制定问题中描述的规范。
(spec/fdef ::predicate-1
:args (spec/cat :arg any?)
:ret boolean?)
我们可以通过传递一些我们知道应该通过或失败测试的示例来测试:
(spec/valid? ::predicate-1 boolean?) => true
(spec/valid? ::predicate-1 (fn [a] 5)) => false
(spec/valid? ::predicate-1 (fn [a] true)) => true
(spec/valid? ::predicate-1 (fn [a b] true))=> false
(spec/valid? ::predicate-1 #(= 10 %)) => true
(spec/valid? ::predicate-1 (fn [a] nil)) => false
用于防御 nr。 2:
(spec/fdef ::predicate-2
:args (spec/cat :arg any?)
:ret (spec/nilable boolean?))
(spec/valid? ::predicate-2 (fn [a] nil)) => true
对于天然橡胶。 3 任何接受一个参数的函数都是有效的,因为 clojure 中的所有内容要么是真要么是假。
(spec/fdef ::predicate-3
:args (spec/cat :arg any?)
:ret any?)
(spec/valid? ::predicate-3 identity) => true
(spec/valid? ::predicate-3 str) => true
我们似乎能够做的一件有趣的事情是让规范为我们生成这样的函数:
(let [p (gen/generate (spec/gen ::pedicate-1))]
(clojure.string/join
" " [(p 0) (p 1) (p -1) (p nil) (p 'a) (p :a) (p (fn [a] a))]))
=> "false true true false true false false"
除此之外,我们也许可以尝试猜测生成的函数的作用。但是如果无法查看来源,我们将很难检查我们的猜测是否正确。