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函数,其行为与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报告)
...