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

欢迎!请参阅关于页面了解更多如何使用本页面的信息。

0
规格
上下文

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