请分享您的想法,在 2024 状态 Clojure 调查!

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

0
Spec

`any?` 生成器有时会返回 Double/NaN 值。由于 NaN 与等式(通过 `=`)不相容,因此您在函数中:ret spec' 着手按谓词处理集合时会出现相当大的问题。这是因为在 ret spec 中的最明显的事情(即谓词对任何值都没有返回 true,因此输出集合应该等于输入集合,因为没有什么被转换/处理),不能简单表示。

在我的规范规格说明中,我想出的一个权宜之计是用 (s/and any? (complement double-NaN?)) 来规范集合的元素,而不是仅仅使用 any?,并且它有效。然而,尽管我可以在测试中没有 NaN,但我必须承认这仍然感觉有点无关紧要。

想法

1) `any?` 的生成器可以从硬编码永不返回 Double/NaN。这似乎相当具有侵略性。
2) `any?` 的生成器可以被重构为以某种方式允许/禁止 Double/NaN。然后,也许可以通过动态-var 和/或宏(例如 without-NaNs)来揭示这一点(这只是一个思考)。
3) `any?` 的生成器可以保持不变,但可以添加一个新的比较运算符,例如(例如 `clojure.spec/===`),它以某种方式忽略 NaN (例如,一个简单的实现可能遍历数据结构,并用关键字替换所有的 NaN,然后执行常规比较)。

4 个答案

0

评论来自:alexmiller

应考虑此更改是否更适合在 test.check 中或在任何? 规范生成器中。

0
by

评论由:jimpil 发布

结果发现我的解决方案并不完全有效。实际上我只是在以下情况下偶然发现

{nil {[] {NaN 0}}}

这符合以下规则的值

(s/def ::persistent-map
(s/map-of ::anything-but-NaN ::anything-but-NaN)) ;; (s/and any? (complement double-NaN?))

因此,内部集合仍然可以包含 NaN。到目前为止,我已经写出了 4 个规范,并且在所有的规范上都遇到了这个问题。:(

0
by

评论由:cap10morgan 发布

{{exclude_NaN_from_any_and_some_generators.patch}} 是我尝试通过防止任何? 和 some? 生成的值中出现 NaN 来解决这个问题的方法。在我的测试中,这似乎解决了问题。

0
by
参考:https://clojure.atlassian.net/browse/CLJ-2054(由 jimpil 奋斗)
...