2024年Clojure调查中分享您的看法!

欢迎!请参阅关于页面以了解更多有关此功能的信息。

+1
Clojure

如果merge使用transients会更好。

补丁
- clj-1458-7.patch

方法
在transients和reduce之后将c.c/merge迁移到核心中。保留旧版merge1以供以前的定义使用。让APersistentMap/conj和ATransientMap/cons了解IKVReduce。

附带的补丁保留了merge的两个现有行为
- 元数据传播
- 合并的右侧可以是Map.Entry、大小为2的IPersistentVector和普通地图。

筛选员

25 个答案

0

评论者:jawolfe

我今天将尝试制作补丁。

0

评论者:jawolfe

这个补丁(transient-merge.diff)使得merge、merge-with和zipmap(因为它就在那里,并且显然可以从transients中受益)使用transients。

三个潜在问题
- 由于函数依赖于transient和其他相关函数,我不得不将函数移动一下。我假设这将比向前声明更可取。这是我找到的最佳位置,但我愿意将其移动到其他地方。
- 我添加了多个可变参数,以避免单参数transient化可能带来的潜在性能成本。如果需要,我很乐意撤销这些更改。
- 由于transient地图不支持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”,‘throw’这个词用得不好。

0

评论由:gshayban发表

那是当然——在CLJ-700提交后不会再使用get。

我们应该添加性能测试。合并两个、三个、多个映射,以及调整映射的大小,对于merge-with,调整碰撞百分比。

我们需要回到(某些身份)逻辑,否则除了提供的第一个映射之外,其他映射的元数据会被传播。我会稍后修复。

0

评论由:michaelblume发表

我不知道这是否应该被允许,但这会出错

(merge {} (link: :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 被用了几次,但我看到没有测试的目的是测试它们的行为。

...