Arrays Common Lisp:在列表和数组之间转换
我们如何在任意嵌套的列表和数组之间优雅地转换 e、 g 变成Arrays Common Lisp:在列表和数组之间转换,arrays,list,common-lisp,Arrays,List,Common Lisp,我们如何在任意嵌套的列表和数组之间优雅地转换 e、 g 变成 #2A((1 2 3) (4 5 6)) 反之亦然,列出二维阵列: (defun list-to-2d-array (list) (make-array (list (length list) (length (first list))) :initial-contents list)) 要列出的二维数组: (defun 2d-array-to-list (a
#2A((1 2 3) (4 5 6))
反之亦然,列出二维阵列:
(defun list-to-2d-array (list)
(make-array (list (length list)
(length (first list)))
:initial-contents list))
要列出的二维数组:
(defun 2d-array-to-list (array)
(loop for i below (array-dimension array 0)
collect (loop for j below (array-dimension array 1)
collect (aref array i j))))
从列表到二维的多维形式很简单
(defun list-dimensions (list depth)
(loop repeat depth
collect (length list)
do (setf list (car list))))
(defun list-to-array (list depth)
(make-array (list-dimensions list depth)
:initial-contents list))
要列出的数组更复杂
也许是这样的:
(defun array-to-list (array)
(let* ((dimensions (array-dimensions array))
(depth (1- (length dimensions)))
(indices (make-list (1+ depth) :initial-element 0)))
(labels ((recurse (n)
(loop for j below (nth n dimensions)
do (setf (nth n indices) j)
collect (if (= n depth)
(apply #'aref array indices)
(recurse (1+ n))))))
(recurse 0))))
要列出解决方案的另一个二维阵列:
(defun 2d-array-to-list (array)
(map 'list #'identity array))
和列表到2d数组(但可能不如上次答复的解决方案有效):
使用强制:将对象强制为Output-type-Spec类型的对象
(coerce '(1 2 3) 'vector) => #(1 2 3)
(coerce #(1 2 3) 'list) => '(1 2 3)
@mck:指定你想要的级别,并给出正确的维度列表,以生成数组。这需要为3d数组编写一个单独的函数吗?嗯。。。这似乎对我不起作用;在运行SBCL 1.4.5的机器上,如果我加载上面的defuns,然后尝试
(要列出的2d数组#2A((12)(34))
,我会得到:值#2A((12)(34))不是向量类型
。类似地,如果我尝试(list-to-2d-array'((12)(34))
,我会发现数组是序列的错误类型说明符。
所以。。。我做错什么了吗?这是否只适用于一些常见的lisp实现?这是其他口齿不清的语言吗?其他?映射结果类型必须是列表或向量的子类型,而不是数组。这就是为什么列表到二维数组不起作用的原因。这只适用于一维列表或向量,不适用于一维以上的数组(请参见原始问题)。
(defun list-to-2d-array (list)
(map 'array #'identity list))
(coerce '(1 2 3) 'vector) => #(1 2 3)
(coerce #(1 2 3) 'list) => '(1 2 3)