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

欢迎!有关此如何工作的更多信息,请参阅关于 页面。

0
Clojure
*问题:* clojure.data/diff 在比较不同映射时,不一致地返回一个惰性序列,但在其他情况下返回一个向量。

user> (data/diff {:a 1 :b 2} {:a 1})
({:b 2} nil {:a 1})

这与文档和正常行为不一致
user> (data/diff {:a 1 :b 2} {:a 1 :b 2})
[nil nil {:a 1, :b 2}]
user> (data/diff #{1 2 3} #{1 2 3})
[nil nil #{1 3 2}]
user> (data/diff #{1 2 3} #{1 2})
[#{3} nil #{1 2}]

文档字符串声明:“递归比较 a 和 b,返回一个元组 [仅存在于 a 中的元素 仅存在于 b 中的元素 两者都有的元素]”,这意味着它应该总是返回一个向量。

9 答案

0

评论由:yenda 提出

修复它只需将 diff-associative 的输出转换为向量,如下所示

`
(defn- diff-associative
"Diff associative things a and b, comparing only keys in ks."
[a b ks]
(vec (reduce
(fn [diff1 diff2]

 (doall (map merge diff1 diff2)))

[nil nil nil]
(map

(partial diff-associative-key a b)
ks))))

`

0

评论由:alexmiller 提出

还有其他解决此问题的潜在方法,例如使用转换器。不确定这是否值得一试,但在我们做出更改时似乎合理考虑。

0

评论由:yenda 提出

这或许可以作为一个改进点,并在其他工单中提出。

在diff-sequential中已经使用了Vec来矢量化列表。我建议只需修复这个错误,并添加应该由它筛选的测试用例。

0
评论者:yenda_

有一个应该已经失败的测试用例。


[{:a #{2}} {:a #{4}} {:a #{3}}] {:a #{2 3}} {:a #{3 4}}


我得到的是


({:a #{2}} {:a #{4}} {:a #{3}})
0

评论由:alexmiller 提出

该测试可能需要更加严格,检查的不仅仅是顺序相等,还要检查返回向量。

好奇的是——这是否在您的代码中引起了问题,还是您只是注意到了它,并且感到惊讶?

0

评论由:yenda 提出

这是一个简单的补丁,它只为映射执行列表中执行的操作:通过vec函数创建一个新向量。

0

评论由:yenda 提出

@Alex Miller:我发现我的程序行为中有一个错误,并追踪到(get diff 2)而不是(nth diff 2),但我意识到它只在某些情况下是错误的,所以我进一步调查并发现问题来自diff。

0

评论由:yenda 提出

更严格的测试,用于检查返回的向量。

0
参考资料:https://clojure.atlassian.net/browse/CLJ-1885(由yenda提交)
...