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

欢迎!请参阅关于页面以了解更多关于其工作的信息。

0
Spec

适用于 `any?` 的生成器偶尔会返回 Double/NaN 值。由于 NaN 与等价(通过 `=`)不合,对根据谓词变换/处理集合的函数进行 :ret 规范,变得相当有挑战性。原因在于在 :ret 下最明显的事情要检查的案例(谓词未对任何值返回 true,因此输出集合应等于输入集合,因为没有任何事物被变换/处理),无法简单地表示。

我在自己的规范中想到的一个解决方案是用 `(s/and any? (complement double-NaN?))` 来规范集合的元素,而不是仅仅使用 `any?`,它可行。尽管我可以没有 NaN 进行测试,但我必须承认这感觉仍然有点像是在做手脚。

想法

1) `any?` 的生成器可以硬编码为永远不会返回 Double/NaN。听起来相当具有侵略性。
2) `any?` 的生成器可以被重新设计为在允许/禁止 Double/NaN 方面可配置。然后可能会使用动态变量和/或宏(例如 `without-NaNs`)公开这一点(这里只是进行头脑风暴)。
3) `any?` 的生成器可以保持现状,但可以添加一个新的等价操作符(例如 `clojure.spec/===`),这个操作符在某种意义上忽略了 NaN(例如,一种简单的实现可能是遍历数据结构,用关键字替换所有 NaN,然后执行常规比较)。

4 答案

0

评论由:alexmiller

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

0

评论由: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

评论由:cap10morgan发表

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

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