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

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

+1投票
Clojure

如果merge使用瞬态会更好。

补丁
- clj-1458-7.patch

方法
在transients和reduce之后将c.c/merge迁移到核心中。保留旧版本作为merge1,供新定义之前使用。让APersistentMap/conj和ATransientMap/cons知道IKVReduce。

附带的补丁保留了merge的两个现有行为
- 元数据传播
- 合并的右侧可以是Map.Entry、size=2的IPersistentVector和常规映射。

筛选方

25个答案

0投票

评论者:jawolfe

我今天会尝试修复这个补丁。

0投票

评论者:jawolfe

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

可能存在三个问题
- 由于依赖瞬态和相关函数,我不得不移动这些函数。我假设这比向前声明更可取。这是我能找到的最佳位置,但乐于将其移动到其他位置。
- 我添加了多个arity,以避免对瞬态单个参数可能产生的性能开销。愿意取消此操作,如果所需。
- 由于瞬态映射不支持contains?(或find),我不得不稍微修改merge-with中的逻辑。

0投票

评论者:michalmarczyk

我在2012年5月30日就为{{zipmap}}提交了一个单独的ticket(补丁),编号为CLJ-1005.

0投票

评论者:jawolfe

哎呀,如果我有越界的地方,我很乐意从这个补丁中移除那个更改,这能简化事情的话——请告诉我。

0投票

评论者:gshayban

提供了一种备选方法,即在协议加载完成后再延迟合并,然后使用transducers。

0投票

评论者:michaelblume

看起来你执行了两次(获取m k)— 难道不应该在局部变量中放进去吗?

0投票

评论者:michaelblume

呃,我的意思是,我说的“抛出”这个词用得不好。

0投票

评论者:gshayban

是的,那是那个 — 一旦CLJ-700被提交,将不再使用get。

我们应该添加性能测试。合并两个、三个、很多地图,以及合并时根据地图大小变化,为merge-with改变碰撞百分比。

需要回到(某个身份)逻辑,否则来自除了提供的第一张地图之外的其他地图会传播元数据。我会稍后修复。

0投票

评论者:michaelblume

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

(合并 {} (链接: :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使用了几次,但看到没有测试的目的是测试它们的行为的。

...