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
"比较仅在 ks 中的键的 a 和 b 中的关联事物。"
[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

这可能与改进有关,可以在其他工单中提出。

在 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 投票
by
参考: https://clojure.atlassian.net/browse/CLJ-1885(由 yenda 提出)
...