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

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

+2
转换器

当前以1-arity调用时,reductions 不提供转换器。

建议

  • reductions-with:具有显式初始化值的 reductions 转换器
  • 由于参数冲突,这是一个单独的函数,而不是与 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" 值。我希望有一个显式 "init" 的 "reductions" 转换器,而不是依赖于无参函数(f)。

如果我记对了,Rich 曾表达过对支持不带 init 的 reduce(类似于 Common Lisp)的一些遗憾。我的理解是,对于新的 Clojure 代码,显式 init 是首选。

不幸的是,对于转换器的显式初始化参数将与标准的 "无初始化" reductions(链接:f coll)发生冲突。在我的代码中,我已使用 "accumulations" 为此转换器命名。另一个可能的名字可能是 "reductions-with"。

0

评论由:pyr 撰写

嗨 Steve,

我非常希望初始化值也能明确指定,不幸的是,除了在2-arity变体中测试第二个参数之外——这可能会更加令人困惑,没有通过普通“reductions”来实现这一点的办法。

我喜欢提供一种“reductions-with”变体,它强制使用初始化值,如果需要,我会很高兴增加这个补丁。

0

评论由:pyr 撰写

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

0

评论由:pyr 撰写

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

0

评论者:alexmiller

我还没有时间查看它,抱歉。

0

评论由:pyr 撰写

@alexmiller,如果结果是得到 clojure.spec,我会花一些时间来审查的。

0

评论由:[email protected] 撰写

对于测试,我建议你比较 transducer 版本的输出和类似序列 reductions 的调用输出。例如,

`

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

`

我希望看到一致性。0002 补丁没有以当前 Clojure reductions 的方式处理初始化值。

0

评论由:pyr 撰写

@alexmiller 我再推一把,至少让我们了解补丁和 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在第3个补丁中提供的reductions-with,它无需任何调整即可直接使用。

...