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

欢迎!请参见关于页面以获取更多关于如何使用本网站的信息。

0 votes
Spec
every-kv文档中表示 "接受单独的键和值谓词,并在关联集合上工作"。向量返回true for associative?但当前不起作用


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 votes

评论人:alexmiller

目前,我倾向于将every-kv中的文档调整一下,应该是“map”而不是“关联集合”,但我会与Rich确认。

0 votes

评论人:alexmiller

已更新至master

0 votes

评论人:alexmiller

更新补丁以适用于spec.alpha。

0 votes
_评论人:stu_

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


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

评论人:alexmiller

向量应该失败 - every-kv需要一个map条目的序列。补丁通过Doc字符串说明了这一点,并修正了在生产explain-data时可能会错误抛出的异常。我更新了标题,在行为后添加了explain-data的描述,并将测试添加到补丁中。

0 votes

评论人:alexmiller

很久以前丢失了docstring更改,现在已重新添加到-7补丁中。

0 votes

评论人:alexmiller

需应用至master的-8次更新,无语义变更

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