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

欢迎!请查看 关于 页面,以了解更多有关此工作是如何进行的。

0
Spec

any? 生成器偶尔会返回一个或多个 Double/NaN 值。由于 NaN 值与等价性(通过 = 操作符)不兼容,对一个按谓词进行收集转换/处理的函数进行 :ret 规范化会变得相当棘手。这是因为 :ret 下最明显要检查的情况(即谓词没有返回任何值为 true,因此输出集合应与输入集合相等,因为没有进行转换/处理),不能简单地表示。

在我的规范中,我已经想出了一个 workaround,即用 (s/and any? (complement double-NaN?)) 而不是只用 any? 规范化集合的元素,并且它确实有效。然而,尽管我可以在测试中摆脱 NaN 值,但我必须承认这仍然感觉有点 hacky。

想法

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
...