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

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

0
Spec
每-kv 文档中指出:"接受单独的键和值谓词,并作用于关联集合"。向量返回为关联?但尚未工作


user=> (s/conform (s/every-kv any? any?) [])
[]
user=> (s/conform (s/every-kv any? any?) [1 2 3])
:clojure.spec/invalid
user=> (s/conform (s/every-kv integer? string?) [])
[]
user=> (s/conform (s/every-kv integer? string?) ["x"])
:clojure.spec/invalid


另一个类似的问题


(s/explain-data (s/every-kv int? int?) [{:a :b}])
UnsupportedOperationException nth 不支持此类类型:PersistentArrayMap  clojure.lang.RT.nthFrom (RT.java:903)


*Cause:* 向量不应与 every-kv 一起使用。every-kv 和 every-impl 的组合假设传递给 every-kv 的集合可以提供一个映射条目的序列。在说明的情况下,由 every-kv 创建的 ::kfn 用于使用键而不是元素索引来创建更好的路径段。kfn 假设集合的元素可以调用 `(nth entry 0)` 在元素上。在上面的说明失败中,映射 {:a :b} 将在调用 nth 时抛出。

*Proposed:* 做以下操作以更清晰地说明所需集合元素是映射条目

* 修改文档字符串以说明 "将序列转换为映射条目" 而不是 "是映射"
* 修改 kfn 以添加一个检查,该检查元素是否是条目,如果是,则使用它的键。如果不是,则使用元素的索引(该索引是指向元素的索引)。在这种情况下,当传递条目时,它将报告实际的键,但当传递不是条目的事物时,它将报告非条目的集合基本索引。

在补丁之后,explain-data 调用将提供一个有意义的错误,而不是上面的异常


user=> (s/explain-data (s/every-kv int? int?) [{:a :b}])
#:clojure.spec.alpha{:problems ({:path [], :pred vector?, :val {:a :b}, :via [], :in [0]})}



*Patch:* clj-2080-8.patch

8 个答案

0

评论由:alexmiller提出

目前,我倾向于说在 every-kv 的文档中应该将“关联集合”改为“映射”,但将与 Rich 确认。

0

评论由:alexmiller提出

更新以应用到 master

0

评论由:alexmiller提出

更新补丁以应用到 spec.alpha

0
_评论由:stu_提出

请更新此工单,包括描述中展示的示例的预期行为,以及展示预期行为的测试。  我仍然看到向量化失败。


(s/explain-data (s/every-kv integer? string?) ["x"])
=> #:clojure.spec.alpha{:problems ({:path [], :pred vector?, :val "x", :via [], :in [0]})}
0

评论由:alexmiller提出

向量应该失败 - every-kv 需要一个映射条目的序列。该补丁通过文档字符串清晰地说明了这一点,并修复了在生成 explain-data 时可能抛出的异常。我更新了标题,并将 explain-data 包含在描述中,并添加了补丁中的测试。

0

评论由:alexmiller提出

之前丢失的文档字符串更改已重新添加到 -7 补丁中。

0

评论由:alexmiller提出

对master进行-8次更新,没有语义变化

0
参考资料: https://clojure.atlassian.net/browse/CLJ-2080(由bbloom报告)
...