clojure.spec fdef 验证

clojure.spec validation for fdef

我正在尝试在 clojure.spec 中使用版本 1.9.0-alpha11 编写高阶函数,但无法获得针对返回函数执行的验证。

使用 clojure.spec 指南的 高阶函数 部分中的示例,我将 adder 形式定义为:

(defn adder [x] #(+ x %))

如指南中所述,我将规范创建为:

(s/fdef adder
  :args (s/cat :x number?)
  :ret (s/fspec :args (s/cat :y number?)
                :ret number?)
  :fn #(= (-> % :args :x) ((:ret %) 0)))

当我在 repl 中执行它时,抛出异常而不是所需的规范验证错误:

user> (def add2 (adder 2))
#'user/add2
user> (add2 2)
4
user> (add2 "s")
ClassCastException java.lang.String cannot be cast to java.lang.Number  clojure.lang.Numbers.add (Numbers.java:128)                                                                                                                                                           
user> 

我试图用 (stest/instrument `adder) 开启规范。虽然这适用于函数,但不适用于 高阶函数

在 clojure 1.9-alpha14 中,高阶函数无法以这种方式进行验证。查看 clojure.spec.test/instrument,它正在寻找规范注册表中的函数,它只包含 fdef 函数。

:ret 中的 fspec 将在通过 clojure.spec.test/check 测试 adder 时使用,同时记录作为它的值的函数。