我试图用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)启动规范。虽然这适用于函数,但它不适用于高阶函数。
发布于 2016-11-09 17:52:40
正如它在clojure 1.9-alpha14 14中所显示的那样,不能以这种方式验证高阶函数。看看clojure.spec.test/instrument,它将在spec的注册表中查找函数,其中只包含fdef'd函数。
:ret中的fspec将在通过clojure.spec.test/check测试adder时使用,并同时记录其值的函数。
https://stackoverflow.com/questions/39382252
复制相似问题