zeh*_*ard 3 clojure common-lisp
在Clojure中,有一个高阶函数reductions
,你可以使用类似的参数,reduce
并返回一个包含所有中间结果的序列.
Common Lisp中是否有等价物?我无法在网上找到任何参考资料,包括https://common-lisp.net/tutorials/上的各种书籍/文章,但鉴于Lisp作为一系列List Processing语言的遗产,我想象一下list-> list函数就像reductions
将存在于方言之间.
它没有标准功能.您可以轻松定义一个:
(defun reductions (function sequence &rest args
&key key from-end (start 0) end initial-value)
(declare (ignore key from-end start end initial-value))
"Return a list of intermediate values from reducing SEQUENCE with FUNCTION."
(let* ((reductions (list))
(result (apply #'reduce
(lambda (&rest arguments)
(let ((result (apply function arguments)))
(push result reductions)
result))
sequence
args)))
(values (or (nreverse reductions)
(list result))
result)))
(reductions #'+ '(1 2 3 4 5 6 7 8 9 10) :initial-value 0)
;=> (1 3 6 10 15 21 28 36 45 55)
Run Code Online (Sandbox Code Playgroud)
编辑:使用APPLY
带&REST ARGS
,而不是调用的REDUCE
直接.REDUCE
如果NIL
为关键字参数提供了s,则某些实现可能不起作用.
Edit2:可以使用0或2个参数调用reduce函数.
Edit3:当REDUCE
使用只有一个元素的列表调用时,唯一的元素按原样返回.根本不调用reduce函数,这意味着减少列表将为空.我添加了一个OR
返回包含在该情况下的列表中的最终结果(以匹配Clojures行为).我还更改了代码以返回最终结果作为第二个返回值(可能有用,"为什么不?").