当函数的仪表化失败时,explain-data 包含 "caller" 信息。然而,如果仪表化失败是指宏,则该信息将丢失。
此评论使我相信,解释数据的预期行为是包含此信息,以便第三方错误打印程序可以显示它。
在下面的复现中,我设置了一个自定义打印器,仅用于捕获原始 explain-data(它不是有用的打印器,只是用来展示正在发生什么)
复现
(require '[clojure.spec.alpha :as s]
)(require '[clojure.spec.test.alpha :as st]
)(require '[clojure.specs.alpha :as s])
:(s/fdef my-fn
:args (s/cat :x int?))
:(defn my-fn [x]
x)
:(s/fdef my-macro
:args (s/cat :x int?))
:(defmacro my-macro [x]
x)
(st/instrument)
:(def !ed (atom nil))
(set! s/*explain-out* (fn [ed]
(reset! !ed ed)))
(my-fn ""
@!ed
>; {:clojure.spec.alpha/problems [{:path [:args :x], :pred clojure.core/int?, :val "", :via [], :in [0]}], :clojure.spec.alpha/spec #object[clojure.spec.alpha$regex_spec_impl$reify__2436 0x72029b0e "clojure.spec.alpha$regex_spec_impl$reify__2436@72029b0e"], :clojure.spec.alpha/value (""), :clojure.spec.alpha/args (""), :clojure.spec.alpha/failure :instrument, :clojure.spec.test.alpha/caller {:file "form-init8333540581183382896.clj", :line 548, :var-scope expound.alpha/eval27394}}
>; ^--- 注意存在 :clojure.spec.test.alpha/caller 的条目
(my-macro ""
@!ed
>; #:clojure.spec.alpha{:problems [{:path [:args :x], :pred clojure.core/int?, :val "", :via [], :in [0]}], :spec #object[clojure.spec.alpha$regex_spec_impl$reify__2436 0x479a6a73 "clojure.spec.alpha$regex_spec_impl$reify__2436@479a6a73"], :value (""), :args ("")}
>; ^--- 没有调用者信息