2024 Clojure 状态调查!中分享你的想法。

欢迎!请参阅关于页面了解更多关于这个站点如何运作的信息。

0 投票
Spec

any? 的生成器偶尔会返回 Double/NaN 值。由于 NaN 与等价(通过 =)不兼容,所以不得将根据谓词转换/处理集合的 fn 进行 :ret spec,变得相当有问题。这是因为最明显要检查的情况(谓词对任何值都没有返回 true,因此输出 coll 应该等于输入 coll,因为没有经过转换/处理),不能简单地表达。

在我自己的 specs 中想出的解决方案是用 (s/and any? (complement double-NaN?)) 来 spec 集合元素,而不是仅仅使用 any?,而且它有效。然而,尽管我可以在测试中不考虑 NaN,但我必须承认这仍然有点像变通方法。

想法

1) any? 的生成器可以硬编码为永远不返回 Double/NaN。这似乎相当具有入侵性。
2) any? 的生成器可以进行改进,使其可配置允许/禁止 Double/NaN。然后也许可以通过动态变量和/或宏(例如 without-NaNs)来公开这一点(这里只是在头脑风暴)。
3) any? 的生成器可以保持不变,但可以添加一个新的等价运算符(例如 clojure.spec/===),它可以忽略 NaN(例如,一个简单的实现可能会遍历数据结构,将所有 NaN 替换为关键字,然后执行常规比较)。

4 答案

0 投票

评论者:alexmiller

应考虑是否将此更改更适合在 test.check 或在 `any?` 的 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发表

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

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