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中的一个调用,这个工单上有可以纠正此问题(假设它被认为是错误)的补丁: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中的调用,这里有一个补丁可以'修复'这个问题(假设这是被认为是错误的),在ticket: https://dev.clojure.org/jira/browse/CLJ-1087

我可以很快确定许多此类调用(例如,因为参数被包装在(set ...)中)总是传递集合。在很小的一部分中,我花了不到一分钟就放弃尝试确定答案,因为完全从代码检查中确定答案需要回溯调用栈相当长一段时间。

0 投票

评论者:jafingerhut

如果您需要一个现成的兼容性替换,它对于clojure.set函数的行为相同,除了它在运行时检查您提供的参数的类型,并在类型不正确时抛出异常(例如,对于联合、交集、差集、子集?和超集?不是集合),请考虑使用fungible库: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报告)
...