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方法已用于向量化列表。我建议仅修复bug并添加应捕获该bug的测试用例。

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:我发现我的程序行为中有一个bug,并将其跟踪到(get diff 2)而不是(nth diff 2),但我意识到它在某些情况下仅是bug,所以我进一步查找并发现它源自diff。

0

评论来自:yenda

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

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