Multidimensional array 返回任意数组的内容

Multidimensional array 返回任意数组的内容,multidimensional-array,common-lisp,Multidimensional Array,Common Lisp,有许多常用的Lisp函数可以访问任意数组的各种属性,例如数组维度。但是没有提供返回数组内容副本的函数(与在生成数组中输入:初始内容)的格式相同)循环。。。collect似乎很有用,但维度嵌套的深度是任意的。宏是合适的,还是有更好的方法?宏是一种代码生成/语言扩展工具。 这里不需要它们 您需要的是一个递归函数: (defun array-to-nested-sequences (array &rest indexes) "Extract the section of the multi

有许多常用的Lisp函数可以访问任意数组的各种属性,例如
数组维度
。但是没有提供返回数组内容副本的函数(与在
生成数组
中输入
:初始内容
)的格式相同)<代码>循环。。。collect似乎很有用,但维度嵌套的深度是任意的。宏是合适的,还是有更好的方法?

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

您需要的是一个递归函数:

(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
(将数组定义为嵌套序列(数组和rest索引)
“提取由索引定义的多维数组的部分。
一定是(T。
当(=(长度索引)(数组秩数组))时,这等同于AREF。“
(let((ni(长度索引)))
(如果(=ni(数组秩数组))
(应用#aref数组索引)
(从下面0开始的i循环(数组维度数组ni)
收集(应用#'数组到嵌套序列数组
(追加索引(列表一(()()())))
(setq init'((1234)(56789)(9101112))
((13 15 15 16) (17 18 19 20) (21 22 23 24)))
数组(生成数组’(2 3 4:初始内容初始化))
(等于(数组到嵌套序列数组)
初始化)
==>T
(等于(数组到嵌套序列数组1)(第二次初始化))
==>T
数组到嵌套序列
实际上可以提取子数组


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

宏是代码转换工具。这里需要的是函数,而不是宏。但是,不清楚为什么需要这样的函数。请添加动机?请参阅@sds My general impression(?)序列函数比基本数组元素操作更强大、更灵活,因此数组到嵌套序列的转换可能提供一些优势。例如,给定一个以嵌套列表表示的整数1..16的4x4平方数组,可以通过
(mapcar(lambda(row)(删除if#'evenp row))列表数组轻松减少
到奇数整数的4x2嵌套列表数组。但是我还不熟悉
调整数组
,它可能提供类似的功能。@coredump是的,我想知道是否可以修改
复制数组
,仅根据
数组维度的值返回嵌套列表
。也不需要复制属性…@davypough:您的总体印象是错误的。请检查和。数组是一种不同的数据类型,它有自己的位置和用例。您应该使用适合该问题的类型。
(优雅化身的sds)->T
它也适用于向量,而不考虑填充指针。您可能会很高兴知道我的临时解决方案是
(从字符串读取(subseq(格式为nil“~S”数组)3))
(直到coredump纠正我的错误)!