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

欢迎!请参阅 关于 页面以了解如何操作的更多信息。

+2
转换器

当以1个参数调用时,reductions当前不提供转换器。

建议

  • 带有显式初始化值的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]发表的评论

建议的补丁通过不带参数调用函数来获取归约的"init"值。我希望有一个显式"init"的"reductions"转换器,而不是依赖于空参数(f)。

如果我记得正确,Rich曾对支持没有初始化的reduce表示遗憾(类似于Common Lisp)。我的理解是,对于新的Clojure代码,显式初始化更受欢迎。

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

0

由:pyr发表的评论

嗨 Steve,

我很希望初始化值也是显式的。不幸的是,除了在2参数版本中测试第二个参数外(这可能会更令人困惑),用普通的"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的方式处理init。

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中看到单一状态解引用的样式会更好一些。

0

由:pyr发表的评论

嗨 @alexmiller,只使用reductions-with并且保持一致的行为会更合理。
我已经添加了第三个补丁,按照您的建议实现它,避免双重解引用。

0

评论人:sickill

友情提示:我已经在我的ClojureScript项目中使用了Pierre-Yves的第三个补丁中的reductions-with,并且它直接 Without any adjustments.

...