我正在尝试使用版本在clojure.spec1.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)
. 虽然这适用于函数,但它不适用于高阶函数。