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

欢迎!请查看 关于页面 获取更多关于它是如何工作的信息。

+1
Clojure

如果合并使用临时数据会更好。

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

三个潜在问题
- 我不得不移动函数,因为它们依赖于暂态和朋友们。我假设这比前向声明更可取。这是我能找到的最佳位置,但如果愿意,我可以把它们移到别处。
- 我添加了多个参数数量,以避免单一参数暂态化可能带来的潜在性能成本。如果需要,我可以撤销这个操作。
- 由于临时地图不支持 contains?(或 find),我不得不稍微修改 merge-with 中的逻辑。

0

评论者:michalmarczyk

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

0

评论者:jawolfe

哦,如果那时我越界了,对此表示歉意。如果要简化事情,我很乐意从这个补丁中删除那个更改——请告诉我。

0

评论者:gshayban

附加一个替代方案,推迟合并直到协议加载完成后,然后使用transducers。

0

评论者:michaelblume

看起来你在做(get m k)两次——是不是应该将其放在一个局部变量中?

0

评论者:michaelblume

嗯,put,我是指在局部变量中“抛出”这个词的选择是错误的。

0

评论者:gshayban

是的,有这么一个问题——在CLJ-700提交后,将不再使用get。

我们还需要添加性能测试。合并两个映射、三个映射、多个映射,以及映射的大小和合并时的冲突百分比。

需要返回到(一些自同态)逻辑,否则元数据会从除了提供的第一个以外的映射中传播。我将稍后修复。

0

评论者:michaelblume

我不知道这是否应该是允许的,但这会出问题

(合并 {} (链接: :foo 'bar))

这被compojure-api在野中使用

0
0

评论者:michaelblume

哈迪,contains? 在底层使用get,所以还是两个get,对吧?似乎坚持使用::none trick会更好一些。

0

评论者:bronsa

这需要if-let + find。

0

评论者:gshayban

新补丁解决了迄今为止的担忧

0

评论者:gshayban

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

0

评论者:michaelblume

很好的方式

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

...