`
(require '[clojure.spec :as s] '[clojure.spec.test :as st])
(defn foo [^double val] val)
(s/fdef foo :args (s/cat :val double?))
(st/instrument `foo)
(foo 5.2)
user=> (foo 5.2)
ClassCastException clojure.spec.test$spec_checking_fn$fn__13069 无法转换为 clojure.lang.IFn$DO
user/eval6 (NO_SOURCE_FILE:5)
user/eval6 (NO_SOURCE_FILE:5)
clojure.lang.Compiler.eval (Compiler.java:6951)
clojure.lang.Compiler.eval (Compiler.java:6914)
clojure.core/eval (core.clj:3187)
clojure.core/eval (core.clj:3183)
clojure.main/repl/read-eval-print--9704/fn--9707 (main.clj:241)
clojure.main/repl/read-eval-print--9704 (main.clj:241)
clojure.main/repl/fn--9713 (main.clj:259)
clojure.main/repl (main.clj:259)
clojure.main/repl-opt (main.clj:323)
clojure.main/main (main.clj:422)
`
原因: spec 用已度量的函数替换 var 值,这对于默认链接情况有效,var 值解引用转换为 ifn,调用,但在其他情况(原始函数,直接链接,其他?)下则无法工作
方法: 考虑基本接口,并使其工作,或者记录/fail度量将无法与此类工作