有许多Common Lisp函数可以访问任意数组的各种属性,例如array-dimensions
。但是没有提供返回数组内容副本的函数(用于在:initial-contents
中输入make-array
的相同格式)。 Loop ... collect
似乎很有用,但维度嵌套是任意深度的。一个宏是合适的,还是有更好的方法?
答案 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
实际上可以提取子数组。
请注意,递归的深度是数组的等级,因此您不太可能耗尽堆栈。