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

欢迎!请参阅关于 页面,了解该系统的工作方式。

0
Spec

any? 生成器偶尔会返回 Double/NaN 值。由于 NaN 与等价性(通过 =)不兼容, retrievable spec'ing 一个根据谓词转换/处理集合的函数就变得相当有问题。因为最常见的检查情况(谓词对任何值都没有返回 true,因此输出集合应该等于输入集合,因为没有进行转换/处理),无法简单地表达。

我在自己的 spec 中想出一个解决方案,即将集合的元素指定为 (s/and any? (complement double-NaN?)) 而不是只是 any?,并且它 works。然而,尽管我可以在测试中不必担心 NaN,但我必须承认这仍然有些/YYYY/笨拙。

想法

1) any? 生成器可以硬编码为从不返回 Double/NaN。听起来相当侵入式。
2) any? 生成器可以被重新设计以对其进行配置,允许/禁止 Double/NaN。然后可能使用动态变量和/或宏(例如 without-NaNs)来公开这一点(此处仅进行头脑风暴)。
3) any? 生成器可以保持原样,但可以添加一个新的等价性运算符(例如 clojure.spec/===),它可以忽略 NaN(例如,一个简化的实现可能会遍历数据结构并将所有 NaN 替换为关键词,然后再执行常规比较)。

4 答案

0

评论者:

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

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 提出

我尝试通过防止 NaN 出现在 any? 和 some? 生成的值中来解决这个问题。似乎我的测试中已经解决了这个问题。

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