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 中存在的元素同时在 a 和 b 中存在的元素]",这意味着它应该总是返回一个向量。

9个答案

0

评论者:yenda

修复它只需将 diff-associative 的输出向量化,如下所示:

`
(defn- diff-associative
"比较关联的 a 和 b,比较 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

还有其他潜在的方法可以解决这个问题,比如使用 transducers。不确定这是否值得做,但在我们进行更改时这似乎是合理的考虑。

0

评论者:yenda

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

Vec 已经被用在 diff-sequential 中的列表向量化。我建议只修复这个缺陷,并添加应该测试此的测试用例。

0
by
评论者:yenda

有一个测试例子应该已经失败了


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


我得到的


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

评论者:alexmiller

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

只是好奇 - 这个问题是否在你的代码中造成问题,还是你只是注意到它,觉得这很奇怪?

0
by

评论者:yenda

这是一个简单的补丁,为映射执行与列表相同的操作:使用 vec 函数创建一个新的向量。

0
by

评论者:yenda

@Alex Miller:我注意到我的程序行为中存在一个错误,并追踪到 get diff 2 而不是 nth diff 2,但我意识到这只是在某些情况下是错误的,所以我进一步检查,发现这实际上来自 diff.

0
by

评论者:yenda

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

0
by
参考: https://clojure.atlassian.net/browse/CLJ-1885(由 yenda 报告)
...