用于"减少和返回中间结果的公共Lisp函数作为序列"

时间:2016-05-20 10:30:12

标签: clojure common-lisp

在Clojure中,有一个高阶函数reductions,你可以使用类似于reduce的参数,并返回一个包含所有中间结果的序列。

Common Lisp中是否有等价物?我无法在网上找到任何参考资料,包括https://common-lisp.net/tutorials/上的各种书籍/文章,但鉴于Lisp作为List Processing语言家族的遗产,我想象一个列表 - >列表函数,如{{方言中将存在1}}。

1 个答案:

答案 0 :(得分:9)

它没有标准功能。您可以轻松定义一个:

(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)

修改:将APPLY&REST ARGS一起使用,而不是直接拨打REDUCE。如果为关键字参数提供REDUCE,则NIL的某些实现可能无效。

Edit2:可以使用0或2个参数调用reduce函数。

Edit3:当使用仅一个元素的列表调用REDUCE时,唯一的元素将按原样返回。根本不调用reduce函数,这意味着减少列表将为空。我添加了OR以返回包含在该情况下的列表中的最终结果(以匹配Clojures行为)。我还更改了代码,将最终结果作为第二个返回值返回(可能有用,“为什么不呢?”)。