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

欢迎!请参阅关于页面,了解更多关于它是如何工作的信息。

+1
Clojure

如果merge使用临时的的话,会更好。

修补程序
- clj-1458-7.patch

方法
将c.c/merge迁移到核心功能中较晚的位置,在transients和reduce之后。将旧版本作为merge1保留,以供在先于新定义的案例中使用。使APersistentMap/conj和ATransientMap/cons了解IKVReduce。

附带的修补程序保留了merge的两个现有行为
- 元数据传播
- 合并的右侧可以是Map.Entry、大小为2的IPersistentVector和普通映射。

由以下人员审核

25 答案

0

评论者:jawolfe

我今天将尝试制作一个补丁。

0

评论者:jawolfe

此补丁(transient-merge.diff)使merge、merge-with和zipmap(因为它就放在那里,显然可以从transients中受益)使用transients。

三个潜在问题
- 我不得不移动函数,因为它们依赖于transient和其朋友们。我假设这比向前声明更有利。这是我能找到的最好的地方,但愿意将它们移动到其他地方。
- 我添加了多个arity,以避免对transient一个参数可能产生的性能成本。如果需要,我愿意撤销这一做法。
- 我不得不稍微修改merge-with中的逻辑,因为transient maps不支持contains?(或find)。

0

由:michalmarczyk 贡献的评论

我在 2012 年 5 月 30 日为 {{zipmap}} 发布了单独的票据,带有补丁:CLJ-1005。

0

评论者:jawolfe

啊,对不起,如果我做得太过分了。如果可以让事情变得简单,我愿意从这个补丁中删除这个更改 —— 只需告诉我。

0

由:gshayban 贡献的评论

附加一个替代方法,在协议加载完毕后再延迟合并,然后使用转置器。

0

由:michaelblume 贡献的评论

看起来您两次做了 (get m k) —— 这不应该在局部中抛出吗?

0

由:michaelblume 贡献的评论

哦,我的意思是,我在局部中写的是“put”,这是一个词语的选择不当。

0

由:gshayban 贡献的评论

是的,是这样的 —— 在 CLJ-700 被提交后就不会再使用 get 了。

我们应该添加性能测试。合并两个映射、三个映射、多个映射,以及切换映射的大小,对于合并-with,切换冲突百分比。

需要回到(某些身份)逻辑,否则元数据会从第一个提供的除外的映射中传播。我会稍后修复。

0

由:michaelblume 贡献的评论

不知道这是否应该被允许,但这会中断

(merge {} (link: :foo 'bar))

该链接在 compojure-api 中广泛使用

0
0

由:michaelblume 贡献的评论

Ghadi,contains? 使用 get 进行底层的操作,所以仍然是两次 get,是吗?看起来坚持使用 ::none 技巧可能会有更高的性能。

0

评论者:bronsa

这个需要 if-let + find。

0

由:gshayban 贡献的评论

新的补丁解决了一系列问题

0

由:gshayban 贡献的评论

CLJ-1458-transient-merge3.patch 移除了愚蠢的内联宏,并改用单例函数。

0

由:michaelblume 贡献的评论

不错 =)

这应该附带测试。如果我们想保留与 MapEntry 合并的能力,我们应该进行测试。这与其说是补丁的弱点,不如说是现有测试的弱点。我在测试套件中看到了几次合并和 merge-with 的使用,但没有看到测试目的是检验它们的行为。

...