上下文
当数据未能符合规格时,问题中的":val"指向不符合规范的数据。':val'(对于每个问题)将在整个':value'(对于整个"explain-data"结构)的":value"中存在。例如
(require '[clojure.spec.alpha :as s])
(s/explain-data
(s/coll-of int?)
[1 2 :a])
;; #:clojure.spec.alpha{:problems ({:path [], :pred int?, :val :a, :via [], :in [2]}), :spec #object[clojure.spec.alpha$every_impl$reify__934 0x1b235c3e "clojure.spec.alpha$every_impl$reify__934@1b235c3e"], :value [1 2 :a]}
当函数未能符合fspec规格时,这种对":val"的解释似乎不适用。
复现
(require '[clojure.spec.alpha :as s])
(s/explain-data
(s/coll-of (s/fspec
:args (s/cat :x int?)))
[(fn [%] (/ 1 %))])
;; #:clojure.spec.alpha{:problems ({:path [], :pred (apply fn), :val (0), :reason "Divide by zero", :via [], :in [0]}), :spec #object[clojure.spec.alpha$every_impl$reify__934 0x420c3355 "clojure.spec.alpha$every_impl$reify__934@420c3355"], :value [#function[expound.alpha/eval28876/fn--28880]]}
预期:为了让与通常的"val"工作方式保持一致,"val"应该是匿名函数。虽然函数参数非常有用,但可能可以将它们与不同的键关联起来?
实际:"val"包含函数的参数,因此不再必然存在于"val"中。