欢迎!有关如何使用本站详细信息,请参阅 关于 页面。
如果 merge 使用临时对象,将会很棒。
补丁 - clj-1458-7.patch
方法 在核心中迁移 c.c/merge,在临时对象和 reduce 之后。保留旧版本作为 merge1,用于在先于新定义的情况中使用。使 APersistentMap/conj 和 ATransientMap/cons 兼容 IKVReduce。
附带的补丁保留了 merge 的两种现有行为- 元数据传播- 合并的右侧可以是 Map.Entry、大小为 2 的 IPersistentVector 以及常规映射。
经
评论由 jawolfe 提出
我今天试试看这个补丁。
此补丁(transient-merge.diff)使 merge、merge-with 和 zipmap(因为它就在那里,显然也可以从临时对象中受益)使用临时对象。
三个可能的问题- 我必须移动函数,因为它们依赖于临时对象及其朋友。我假设这比前向声明要好。这是我找到的最佳位置,但愿意移动到其他地方。- 我添加了多个参数,以避免对单个参数进行临时处理的潜在性能成本。愿意撤销此操作。- 我必须稍微修改 merge-with 中的逻辑,因为临时映射不支持 contains?(或 find)。
评论者:michalmarczyk
我在2012年5月30日为{{zipmap}}发布了一个单独的工单,包含补丁:CLJ-1005。
抱歉如果超过了原先的范围。如果您认为这会使事情变得简单,我很乐意从这个补丁中删除这个更改——只需告诉我。
评论者:gshayban
附加了另一种方法,在协议加载后延迟合并,然后使用transducers。
评论者:michaelblume
看起来您重复执行了(get m k)两次——这不应该在一个局部变量中抛出吗?
呃,我的意思是,在局部变量中的"put"是一个不好的词选择。
是的,那也是——提交CLJ-700之后将不再使用get。
我们应该添加性能测试。合并两个地图,三个,许多地图,还可以改变地图的大小,以及对于merge-with,改变冲突的百分比。
需要回到(某种恒等)逻辑,否则元数据将从除了第一个提供的地图以外的其他地图传播。稍后我会修复。
我不知道这是否应该是允许的,但这会中断
(merge {} (link: :foo 'bar))
这是compojure-api广泛使用的内容。
https://github.com/metosin/compojure-api/blob/0.16.6/src/compojure/api/meta.clj#L198
Ghadi, contains? 在底层使用 get,所以它依然还是两次 get,对吧?看起来持续使用 ::none 技巧可能会有更好的性能。
评论者:bronsa
需要使用 if-let 和 find。
新的补丁解决了迄今为止的所有担忧
CLJ-1458-transient-merge3.patch 删除了愚蠢的内联宏,而是使用单例函数。
很好 =)
这应该包含测试。如果我们想保留与 MapEntry 合并的能力,我们应该测试它。这与其说是一个补丁的弱点,不如说是现有测试的弱点。我在测试套件中看到几次 merge 和 merge-with 被使用,但我看不到有哪个测试的目的是测试它们的行为。