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(因为它就在那里,并且显然也可以从 transient 中受益)使用 transient。

三个潜在问题
- 由于函数依赖于 transient 和其朋友,我不得不将其移动。我假设这比前向声明更可取。这是我能找到的最佳位置,但很乐意移动它们。
- 添加了多个arity,以避免将单个参数 transient 化可能带来的性能成本。如果需要,我很乐意撤销这一点。
- 由于 transient 映射不支持 contains?(或 find),我不得不略微修改 merge-with 中的逻辑。

0

评论由:michalmarczyk

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

0

评论者:jawolfe

哎呀,对不起,如果那时我越界了。如果那样能简化问题,我很乐意从补丁中移除那个更改——只告诉我一下。

0

评论由:gshayban

附加了另一种方法,推迟合并直到协议加载后,然后使用transducers。

0

评论由:michaelblume

看起来你在做(获取 m k)两次——那不应该是在本地导入吗?

0

评论由:michaelblume

呃,我在本地启用的是“put”,意思是“抛出”是差劲的措辞。

0

评论由:gshayban

是的,那就是——CLJ-700 提交后就不会再使用 “获取”了。

我们还应该添加性能测试。合并两个、三个、许多地图,以及按地图大小变化,对于合并函数,则按碰撞百分比变化。

需要再次检查(某些身份)逻辑,否则元数据将从除了第一个提供的地图以外的地图传播。稍后修复。

0

评论由:michaelblume

我不知道这是否应该被允许,但这会破坏

(合并{}(链接::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 和 merge-with 被使用了几次,但我没有看到旨在测试其行为的测试。

...