2024 Clojure状态调查中分享您的想法!

欢迎!有关如何使用本站的信息,请参阅关于页面。

0
Spec
上下文

当数据无法符合规格时,问题的":val"指向不符合规格的数据。这个性质很好,因为每个问题的":val"都将存在于整个"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"不再存在于"value"中。

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

评论由:alexmiller 提出

请勿设置修复版本 - 核心团队将在其针对版本发布时进行此操作。对于1.9版本将不会解决。

0

评论者:bbrinck

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

补充一点背景信息:有时对问题中“in”的解释很棘手(《https://dev.clojure.org/jira/browse/CLJ-2192》))。在Expound中,我使用了一个启发式方法来推断“in”路径应该如何工作,但这个启发式方法依赖于“val”存在于“value”中。由于这个问题,启发式方法不起作用,这意味着我无法可靠地报告规范错误。请参见(《https://github.com/bhb/expound/issues/41》)。

0
参考:《https://clojure.atlassian.net/browse/CLJ-2258》(由bbrinck报告)
...