返回任意数组的内容

时间:2017-03-20 16:48:49

标签: multidimensional-array common-lisp

有许多Common Lisp函数可以访问任意数组的各种属性,例如array-dimensions。但是没有提供返回数组内容副本的函数(用于在:initial-contents中输入make-array的相同格式)。 Loop ... collect似乎很有用,但维度嵌套是任意深度的。一个宏是合适的,还是有更好的方法?

1 个答案:

答案 0 :(得分:1)

宏是一种代码生成/语言扩展工具。 你在这里不需要它们。

您需要的是递归函数:

(defun array-to-nested-sequences (array &rest indexes)
  "Extract the section of the multidimentional array defined by the indexes.
Must be (<= (length indexes) (array-rank array)) ==> T.
When (= (length indexes) (array-rank array)), this is equivanent to AREF."
  (let ((ni (length indexes)))
    (if (= ni (array-rank array))
        (apply #'aref array indexes)
        (loop for i from 0 below (array-dimension array ni)
          collect (apply #'array-to-nested-sequences array
                         (append indexes (list i)))))))

(setq init '(((1 2 3 4) (5 6 7 8) (9 10 11 12))
             ((13 15 15 16) (17 18 19 20) (21 22 23 24)))
      array (make-array '(2 3 4) :initial-contents init))

(equal (array-to-nested-sequences array)
       init)
==> T
(equal (array-to-nested-sequences array 1) (second init))
==> T

array-to-nested-sequences实际上可以提取子数组。

请注意,递归的深度是数组的等级,因此您不太可能耗尽堆栈。