Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays Common Lisp:在列表和数组之间转换_Arrays_List_Common Lisp - Fatal编程技术网

Arrays Common Lisp:在列表和数组之间转换

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

我们如何在任意嵌套的列表和数组之间优雅地转换

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 (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)