欢迎!请查看 关于页面 获取更多关于它是如何工作的信息。
如果合并使用临时数据会更好。
补丁 - clj-1458-7.patch
方法 在核心中迁移 c.c/merge 到 transients & reduce 之后的后期。保留较旧的版本,命名为 merge1,用于在新的定义之前的情况。让 APersistentMap/conj & ATransientMap/cons 识别 IKVReduce。
附带的补丁保留了 merge 的两种现有行为- 元数据传播- 合并的右边可以是 Map.Entry、大小为 2 的 IPersistentVector 以及普通地图。
由谁筛选
评论者:jawolfe
我今天将尝试制作一个补丁。
此补丁(transient-merge.diff)使 merge、merge-with 和 zipmap(因为它就在那里,显然也可以从暂态中受益)使用暂态。
三个潜在问题- 我不得不移动函数,因为它们依赖于暂态和朋友们。我假设这比前向声明更可取。这是我能找到的最佳位置,但如果愿意,我可以把它们移到别处。- 我添加了多个参数数量,以避免单一参数暂态化可能带来的潜在性能成本。如果需要,我可以撤销这个操作。- 由于临时地图不支持 contains?(或 find),我不得不稍微修改 merge-with 中的逻辑。
评论者:michalmarczyk
我在2012年5月30日为{{zipmap}}单独提交了带补丁的工单:CLJ-1005。
哦,如果那时我越界了,对此表示歉意。如果要简化事情,我很乐意从这个补丁中删除那个更改——请告诉我。
评论者:gshayban
附加一个替代方案,推迟合并直到协议加载完成后,然后使用transducers。
评论者:michaelblume
看起来你在做(get m k)两次——是不是应该将其放在一个局部变量中?
嗯,put,我是指在局部变量中“抛出”这个词的选择是错误的。
是的,有这么一个问题——在CLJ-700提交后,将不再使用get。
我们还需要添加性能测试。合并两个映射、三个映射、多个映射,以及映射的大小和合并时的冲突百分比。
需要返回到(一些自同态)逻辑,否则元数据会从除了提供的第一个以外的映射中传播。我将稍后修复。
我不知道这是否应该是允许的,但这会出问题
(合并 {} (链接: :foo 'bar))
这被compojure-api在野中使用
https://github.com/metosin/compojure-api/blob/0.16.6/src/compojure/api/meta.clj#L198
哈迪,contains? 在底层使用get,所以还是两个get,对吧?似乎坚持使用::none trick会更好一些。
评论者:bronsa
这需要if-let + find。
新补丁解决了迄今为止的担忧
CLJ-1458-transient-merge3.patch 删除了愚蠢的内联宏,改用了单例函数。
很好的方式
这应该附带测试。如果我们想保持与MapEntry合并的能力,我们应该测试它。这与其说是补丁的弱点,不如说是现有测试的弱点。我看到测试套件中几次使用了合并和合并with,但我没有看到测试目的就是测试它们的行为的测试。