fdef的clojure.spec验证

时间:2016-09-08 03:42:30

标签: clojure clojure.spec

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

使用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)打开规格。虽然这适用于功能,但它不适用于高阶函数

1 个答案:

答案 0 :(得分:3)

因为它位于clojure 1.9-alpha14中,所以无法以这种方式验证高阶函数。查看clojure.spec.test/instrument,它正在查看规范注册表中的函数,该函数仅包含fdef&#d; d函数。

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