【发布时间】:2012-03-03 20:24:18
【问题描述】:
我们如何优雅地在任意嵌套的列表和数组之间进行转换?
例如
((1 2 3) (4 5 6))
变成
#2A((1 2 3) (4 5 6))
反之亦然
【问题讨论】:
标签: arrays list common-lisp
我们如何优雅地在任意嵌套的列表和数组之间进行转换?
例如
((1 2 3) (4 5 6))
变成
#2A((1 2 3) (4 5 6))
反之亦然
【问题讨论】:
标签: arrays list common-lisp
二维数组列表:
(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))))
list 到 2d 的多维形式很简单。
(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))
并列出到二维数组(但可能不如上次回复的解决方案效率高):
(defun list-to-2d-array (list)
(map 'array #'identity list))
【讨论】:
(2d-array-to-list #2A((1 2) (3 4))),我得到:The value #2A((1 2) (3 4)) is not of type VECTOR。同样,如果我尝试(list-to-2d-array '((1 2) (3 4))),我会得到ARRAY is a bad type specifier for sequences. 所以......我做错了什么吗?这只适用于一些常见的 lisp 实现吗?这是来自其他 lisp 的吗?其他?
使用强制:将对象强制为 Output-Type-Spec 类型的对象。
(coerce '(1 2 3) 'vector) => #(1 2 3)
(coerce #(1 2 3) 'list) => '(1 2 3)
【讨论】: