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

欢迎!请查阅关于页面以了解有关其工作方式的更多信息。

0
Spec
every-kv文档表明“接受独立的关键字和值先验条件,并作用在关联集合上”。向量返回true表示是关联性的,但目前却不工作。


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)


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

*建议:以下是对collect元素是映射条目的要求的更清晰的说明。

*修改文档字符串,以“序列到映射条目”代替“是一个映射”
*修改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]})}



*补丁:clj-2080-8.patch

8 答案

0

评论者:alexmiller

目前,我倾向于认为every-kv中的文档应该严格一些,用“映射”而不是“关联集合”,但将与Rich核实。

0

评论者:alexmiller

更新以应用到主分支

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需要一个map条目的序列。补丁在文档字符串中明确说明,并修复了在生成explain-data时可能会抛出的异常(不正确地)。我更新了标题,在行为后面添加了explain-data的描述,并在补丁中添加了测试。

0

评论者:alexmiller

文档字符串的更改在一段时间前丢失了,在-7补丁中重新添加。

0

评论者:alexmiller

-8更新应用于主分支,无语义更改

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