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]}


"val"的这一解释似乎不适用于函数无法符合fspec规范的情况。

重现


(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报告)
...