欢迎!请参阅关于页面以了解更多有关此功能的信息。
如果merge使用transients会更好。
补丁 - clj-1458-7.patch
方法 在transients和reduce之后将c.c/merge迁移到核心中。保留旧版merge1以供以前的定义使用。让APersistentMap/conj和ATransientMap/cons了解IKVReduce。
附带的补丁保留了merge的两个现有行为- 元数据传播- 合并的右侧可以是Map.Entry、大小为2的IPersistentVector和普通地图。
筛选员
评论者:jawolfe
我今天将尝试制作补丁。
这个补丁(transient-merge.diff)使得merge、merge-with和zipmap(因为它就在那里,并且显然可以从transients中受益)使用transients。
三个潜在问题- 由于函数依赖于transient和其他相关函数,我不得不将函数移动一下。我假设这将比向前声明更可取。这是我找到的最佳位置,但我愿意将其移动到其他地方。- 我添加了多个可变参数,以避免单参数transient化可能带来的潜在性能成本。如果需要,我很乐意撤销这些更改。- 由于transient地图不支持contains?(或find),我必须稍微修改merge-with中的逻辑。
评论由:michalmarczyk发表
我在2012年5月30日为{{zipmap}}发布了一个单独的票据,附有补丁:CLJ-1005。
啊,如果当时我越界了,很抱歉。如果那样会使事情简化,我愿意从这个补丁中删除那个变化——请告诉我。
评论由:gshayban发表
附上替代方案:在协议加载之后延后合并,然后使用transducers。
评论由:michaelblume发表
看起来您重复执行了(get m k)两次——这不应该被放在本地吗?
哦,我指的是在局部中“put”,‘throw’这个词用得不好。
那是当然——在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 被用了几次,但我看到没有测试的目的是测试它们的行为。