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

欢迎!请查看关于页面以获取更多关于如何使用本网站的信息。

+1 投票
Clojure

如果merge使用transient会更好。

补丁
- clj-1458-7.patch

方法
在core中将c.c/merge迁移到transient和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中受益)使用transient。

三个潜在问题
- 由于这些函数依赖于transient和好友,我不得不移动它们。我假设这比前向声明更好。这是我找到的最好的位置,但如果需要,我愿意将它们移到其他地方。
- 我添加了多个arity,以避免将单个参数transient化的潜在性能代价。如果需要,我愿意撤销这一变更。
- 我必须稍微更改merge-with中的逻辑,因为transient映射不支持contains?(或find)。

0 投票

评论由:michalmarczyk

我在2012年5月30日为{{zipmap}}单独提交了包含补丁的工单:CLJ-1005。

0 投票

评论者:jawolfe

啊,如果我不小心越界了,那么我很乐意从这个补丁中删除这个更改——只是告诉我。

0 投票

评论由:gshayban

附加了另一种方法,在加载协议之后延迟合并,然后使用transducers。

0 投票

评论由:michaelblume

看起来你重复做了(获取m k)——这不是应该放在局部变量中吗?

0 投票

评论由:michaelblume

啊,我没有说“抛出”——这是个糟糕的用词。

0 投票

评论由:gshayban

是的,那是个问题——在CLJ-700提交之后再也不会使用get了。

我们还应该添加性能测试。合并两个、三个、很多地图,以及根据地图的大小变化,以及对于合并操作,根据冲突百分比变化。

需要返回到(某些identity)逻辑,否则元数据会从除了提供的第一个地图之外的其他地图传播。我会稍后修正。

0 投票
by

评论由:michaelblume

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

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

这是在 compojure-api 中广泛使用的

0 投票
0 投票
by

评论由:michaelblume

Ghadi,contains?在幕后使用get,因此它仍然是两次get,对吗?这似乎意味着坚持使用::none技巧将更高效。

0 投票
by

由:bronsa 发布的评论

这需要if-let + find。

0 投票
by

评论由:gshayban

针对迄今为止的关注点提出了新补丁

0 投票
by

评论由:gshayban

CLJ-1458-transient-merge3.patch删除了愚蠢的内联宏,使用单例函数代替。

0 投票
by

评论由:michaelblume

好 =)

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

...