在常见的lisp中减少/折叠2d数组的最佳方法

时间:2015-02-28 00:56:08

标签: common-lisp

Emacs lisp有reduce-vec。在没有使用循环或重新发明轮子的情况下,在普通的lisp中执行此操作的正确方法是什么?

1 个答案:

答案 0 :(得分:6)

您应该可以使用以下内容。它适用于任何维度的数组。

(defun reduce-multidimensional-array (fn arr &rest args)
  (apply #'reduce
         fn
         (make-array (array-total-size arr) :displaced-to arr)
         args))

简而言之,这可以通过创建一个与传入的数组共享元素的一维数组来实现。由于reduce适用于一维数组,因此可以减少新数组。

函数array-total-size返回数组中元素的总数,并且:displa-to keyword参数使新数组与传入的数组共享元素(即使它们具有不同的维度)。