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

欢迎!请参阅关于页面了解关于该功能的更多信息。

+2
Clojure

已创建了多个工单建议,在clojure.set命名空间中的某些函数给定非集合作为参数时可能会抛出异常,因为这些函数在某些情况下返回了意外的值。以下列表仅为示例,并非详尽无遗:CLJ-810、CLJ-1682、CLJ-1953、CLJ-1954

现在clojure.spec存在后,可以更精确地记录这些函数的预期参数类型。这些规范可以用于在测试中动态检测传递给这些函数的错误参数类型,并且可以用于未来基于clojure.spec构建的其他方式。

Alex Miller在一次Slack讨论中建议,如果贡献者能帮助实现Clojure中的此类规范,可能会有所帮助。

所提出的补丁采取的方法是简单地规范 clojure.set/subset?、superset?、union、intersection 和 difference 的 :args 必须都是集合,并且规定前两个 :ret 类型为布尔值,最后三个为集合。这似乎与拒绝之前提出更改这些函数行为的行为时给出的所有已知评论相符。

补丁:CLJ-2287-add-clojure-set-specs-v1.patch

在上述补丁中未采取的另一种方法是允许将 nil 作为参数和返回值,但尚不清楚这是否是这些函数的预期合同的一部分,或者是其当前实现的一个意外方面。

我(Andy Fingerhut)检查了所有Clojure和contrib项目中的clojure.set/union、difference、intersection、superset?和subset?的出现,并且只有一个这样的调用可以快速确定并未向它们传递集合,那就是clojure.data/diff中的调用。针对该调用有一个补丁,可以在该工单上纠正此问题(假设它被认为是bug):CLJ-1087

我可以快速确定的大多数此类调用总是传递了集合(例如,因为参数被包装在(set ...)调用中)。在很小一部分中,我在一分钟内放弃了试图弄清楚答案,因为完全通过代码审查来确定答案需要回溯调用树很久。

请提出其他评估这些更改的方法,以增加您对这些更改正确性的信心。

7 答案

0
评论由:alexmiller

暂时我会说当然。 :) 我认为这个特定的例子是一个很好的例子。

我不确定这里的所有规范都像你期望的那样明显,或者至少那是我以前的经历。

顺便说一下,我预计这些规范将位于clojure.set.specs命名空间中。
0

评论由:jafingerhut

附件 CLJ-2287-add-clojure-set-specs-v1.patch,日期为2017年12月13日。这是我第一次写Clojure规范,所以请随意提出改进意见。

我使用了clojure.set.specs.alpha命名空间而不是clojure.set.specs,正如你建议的那样,但如果你真的希望去掉.alpha,我可以轻松地更改它。

0

评论由:jafingerhut

如果有某种方式我可以使用大量测试用例对:args规范进行测试,请告诉我如何进行,我可以尝试。

很显然,我至少为:args和:ret选择了一些非常明显的规范,我认为这些规范是正确的,考虑到这些函数过去解决的问题。在我看来,它们对于这些函数来说不太可能有更多的微妙之处,但如果我遗漏了什么,请告诉我,例如,Clojure核心团队已经决定支持这些函数的非集合参数。

我同意clojure.set命名空间中的其他一些函数在规范参数方面可能要复杂一些。

0

评论由:jafingerhut

我查看了所有的Clojure和contrib项目中的clojure.set/union、difference、intersection、superset? 和 subset? 出现情况,只有一个我可以快速确定并不传递集合给它们的调用。它是在clojure.data/diff中的,有一个补丁可以在这个问题上‘纠正’(假设它被认为是一个错误)在这个问题上: https://dev.clojure.org/jira/browse/CLJ-1087

我可以快速确定的大多数此类调用总是传递了集合(例如,因为参数被包装在(set ...)调用中)。在很小一部分中,我在一分钟内放弃了试图弄清楚答案,因为完全通过代码审查来确定答案需要回溯调用树很久。

0

评论由:jafingerhut

如果您需要一个现成的兼容的替换方案,用于clojure.set中的功能,这些功能的行为相同,除了它们会对您提供的参数进行运行时的类型检查,如果类型不正确(例如,用于并集、交集、差集、子集和超集? 不是集合),则抛出异常,请考虑使用可交换库:https://github.com/jafingerhut/funjible

0

评论由:jafingerhut

这个GitHub仓库实现了一些关于Clojure核心功能规范的想法:https://github.com/slipset/speculative

有一些讨论这个问题,讨论了在某些测试集合中看到的clojure.set函数规范的一些违规类型。我还没有看到有关所有数据的简要总结。只是想从这个问题中提供链接以供参考:https://github.com/slipset/speculative/issues/161

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