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中的调用,在这次条目上有一个补丁可以'纠正'这个(假设它被认为是一个错误):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报告)
...