欢迎!请参阅关于页面以了解更多关于此功能的信息。
调用时,如果使用1个参数,减少目前不提供变换器。
提议
第二个补丁提出了一个允许显式初始化值的变体:reductions-with
(断言(=(sequence(reductions-with + 0)[1 2 3 4 5])[1 3 6 10 15]))
补丁: 0003-add-reductions-with.patch
由: Alex Miller预审
评论者:[email protected]
建议的补丁通过调用不带参数的函数来通过reduce获取"init"值。我希望有一个显式"init"作为参数的"reductions"变换器,而不是依赖于nullary(f)。
如果我记得正确的话,Rich曾对支持没有初始化的reduce(类似于Common Lisp)表示遗憾。我的理解是,对于新的Clojure代码,显式初始化值更受欢迎。
不幸的是,对于变换器的显式初始化参数与标准的没有初始化的reductions(链接:f coll)可能会冲突。在我的代码中,我已经为这个变换器使用了"累积"这个名称。另一个可能的名字可能是"reductions-with"。
评论者:pyr
你好,Steve,
我非常希望初始化值也能显式表示,很不幸,除了测试2-参数变体的第二个参数(这可能会更令人困惑)之外,没有其他方法可以用普通的"reductions"来实现。
我喜欢提供"reductions-with"变体的想法,这个变体强迫用户提供初始化值,如果需要的话,我很乐意增加补丁。
Steve Miner,我添加了包含reductions-with的变体。
我能帮上什么忙来推动这个过程吗?@alexmiller 对代码本身有什么评论吗?
评论人:alexmiller
还没有时间查看,抱歉。
@alexmiller,如果得到clojure.spec,我会多花点时间来审查 :-)
对于测试,我建议你比较由转换器版本产生的输出与调用sequence reductions的类似调用的输出。例如,
`
(is (= (reductions + 3 (range 20)) (sequence (reductions-with + 3) (range 20)))
我想看到这种等价性。0002补丁没有用与当前Clojure reductions相同的方式处理init。
@alexmiller 我正在尝试再次推动至少对补丁和reductions-with变体有一个了解,因为1.9似乎越来越接近发布。
抱歉,我不知道我何时能够处理它,或者它是否会考虑在1.9版本中。我也不确定它是否会(或不 会),只是...我不知道。
@alexmiller,感谢您及时的回复。我正试图确保在反馈到来时我会在场,以便能够快速行动。干杯!
@alexmiller,这个更改有进入的可能性吗?或者我能否以任何方式修改/完善这段代码?
有机会的时候我会先进行预筛选。
我认为我更喜欢reductions-with方法,而不是将其重载到reductions中。
这里有两次@state的解引用,在我们所假设的情况下这并没有问题,但我觉得在let中只进行一次state的单次解引用在风格上更可取。
你好@alexmiller,只有reductions-with更有意义,并且行为一致。我已添加第三个补丁,根据您的建议实现它,避免了双重解引用。
评论者:sickill
通知:我已在我的ClojureScript项目中使用了Pierre-Yves的第三个补丁中的reductions-with,并且它直接工作,无需任何调整。