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

欢迎!请查看关于页面,以了解更多信息。

+2投票
转换器

当使用1个参数调用时不提供转换器。

提议

  • 具有显式初始化值的reductions转换器:reductions-with
  • 由于参数冲突,这是一个独立的函数,而不是与reductions结合

第二个补丁提议了一种允许显式初始化值的变种:reductions-with

(assert (= (sequence (reductions-with + 0) [1 2 3 4 5]) [1 3 6 10 15])))

补丁: 0003-add-reductions-with.patch

审核者: Alex Miller

16 个回答

0投票

[email protected]发表的评论

建议的补丁通过调用无参数的函数获取reductions的"init"值。我希望一个"reductions"转换器可以接受显式的"init",而不仅仅是依赖于空参数(f)。

如果记得的话,Rich曾表示对支持不带初始化的reduce(类似于Common Lisp)表示遗憾。我的理解是,显式初始化值是新Clojure代码的首选。

不幸的是,转换器的显式初始化参数与标准的"无初始化"reductions(链接:f coll)存在冲突。在我的代码中,我已经使用了"累积"这个名称来表示这个转换器。另一个可能的名称可能是"reductions-with"。

0投票

由pyr发表的评论

史蒂夫,

我非常希望初始化值也是显式的,不幸的是,除了在2个参数的变体中测试第二个参数之外(这可能会更令人困惑),用plain "reductions"是无法做到这一点的。

我喜欢提供"reductions-with"变体的想法,这样就可以强制初始化值,如果需要,我会乐意在补丁中加入这个功能。

0投票

由pyr发表的评论

@Steve Miner 我添加了一个带有 reductions-with 的变体。

0投票

由pyr发表的评论

我能做些什么来推进这个项目吗?
@alexmiller 对这个代码本身有什么评论吗?

0投票

评论由:alexmiller 提供

我还没机会查看它,抱歉。

0投票

由pyr发表的评论

@alexmiller,如果最终结果是 clojure.spec,我会花些时间来审查这个补丁的。——)

0投票

[email protected]发表的评论

为了测试,我建议你比较 transducer 版本的输出和调用相似 sequence reductions 的输出。例如,

`

(is (= (reductions + 3 (range 20)) (sequence (reductions-with + 3) (range 20)))

`

我希望看到等价性成立。0002 补丁没有像当前 Clojure reductions 那样处理 init。

0投票

由pyr发表的评论

@alexmiller 我正在尝试再次推动 patch 和 reductions-with 变体的讨论,因为 1.9 看起来越来越接近发布。

0投票

评论由:alexmiller 提供

抱歉,不知道我是否能很快处理它或它在 1.9 中将会得到考虑。我也不知道它不会,只是……不知道。

0投票

由pyr发表的评论

@alexmiller,感谢您迅速回复。我在尝试确保在反馈到达时我会在场,以便能够快速采取行动。加油!

0投票

由pyr发表的评论

@alexmiller,是否有额外的见解,比如这有可能实现吗?或者我能否以任何方式调整/完善代码?

0投票

评论由:alexmiller 提供

我会争取有机会先进行筛选。

0投票

评论由:alexmiller 提供

我认为我更喜欢reductions-with的方法,而不是重新定义reductions。

你有两个解除引用@state - 根据我们在这里做出的假设,这并不错,但我认为在let中看到单一解除引用的state会有更好的风格。

0投票

由pyr发表的评论

嗨 @alexmiller,只有reductions-with,并且有一个一致的行为,这会更合理。
我已经添加了第三个补丁,该补丁根据您的建议实现,以避免双重解除引用。

0投票

评论者:sickill

仅供参考,我已经在ClojureScript项目中使用了Pierre-Yves的第三个补丁中的 reductions-with,并且无需任何调整即可正常工作。

...