请在2024 Clojure调查问卷!中分享您的想法。

欢迎!请参阅关于页面以获取更多关于该功能的信息。

0
Spec
上下文

当数据未能符合规格时,问题中的":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"中。

4 个回答

0

评论者:bbrinck

这也使得错误信息具有误导性

`
(s/explain
(s/coll-of (s/fspec

         :args (s/cat :x int?)))

[(fn [%] (/ 1 %))])

;; In: [0] val: (0) fails predicate: (apply fn), Divide by zero
`

因为它似乎表明参数不符合规范,而实际上问题是函数本身不符合规范。

0
by

评论者:alexmiller

请勿设置修正版本 - 核心团队会在目标发布版本时完成这项工作。1.9 不会解决这个问题。

0
by

评论者:bbrinck

对此表示歉意 - 我会确保将来不再设置该字段。

更多背景信息:在某些情况下,问题中的 "in" 很难以解释(https://dev.clojure.org/jira/browse/CLJ-2192)。在 Expound 中,我使用了启发式方法来确定 "in" 路径应该如何工作,但这个启发式方法依赖于 "val" 存在于 "value" 中。由于这个问题,启发式方法不能工作,这意味着我无法可靠地报告 spec 错误。请参阅 https://github.com/bhb/expound/issues/41

0
by
参考:https://clojure.atlassian.net/browse/CLJ-2258(报告者:bbrinck)
...