Common Lisp 中的非矩形数组?(出于教学目的的一般问题。)

Dem*_*ame 2 common-lisp multidimensional-array

只是为了完整起见,我想知道是否有一种方法可以在 Common Lisp 中定义“锯齿状”或“参差不齐的数组”,就像 Java 中描述的那样,例如:https: //www.geeksforgeeks.org/jagged -java中的数组/

伴随这个问题而来的是第二个问题,这样定义多维数组有什么好处呢?更有效的内存分配?或者“锯齿状数组”的想法本身就有问题——至少在 Common Lisp 上下文中是这样?

到目前为止,我只能找到定义矩形多维数组的常规方法的描述 - 或者我忽略了我正在搜索的信息。

此时此刻,我想象在 Common Lisp 中,如果这种不对称数据字段的复制似乎有用的话,人们会用 NIL 或 0 或类似常规多维数组中的内容填充不需要的位置。...或者我可能会通过尝试用它们定义一个自定义结构来管理三个不同长度的向量。

如果这些都是愚蠢的想法,还有其他方法吗?或者,Java 中的“参差不齐的数组”通常只是一个具有不同大小元素的嵌套向量,而 Common Lisp 中的多维数组也只是一个具有相同大小元素的嵌套向量,它附带了一些用于管理常规结构的有用抽象?

我非常感谢您的回复。

Rai*_*wig 6

由于它们是向量的向量,因此很容易定义。例子:

吸气剂

(defun jref (jarray i j)
  (aref (aref jarray i) j))
Run Code Online (Sandbox Code Playgroud)

二传手

(defun (setf jref) (new-value jarray i j)
  (setf (aref (aref jarray i) j) new-value)) 
Run Code Online (Sandbox Code Playgroud)

制作这样一个数组:(make-jarray '(3 (5 6 2))

(defun make-jarray (dimensions &key (initial-element 0))
  (make-array
   (first dimensions)
   :initial-contents (loop for d in (second dimensions)
                           collect (make-array
                                    d
                                    :initial-element initial-element))))
Run Code Online (Sandbox Code Playgroud)

例子:

CL-USER > (let ((ja1 (make-jarray '(4 (3 2 4 5)))))
            (setf (jref ja1 0 1) 'hello)
            (setf (jref ja1 3 4) 'world)
            (incf (jref ja1 2 0) 42)
            (values ja1
                    (jref ja1 2 0)))

#(#(0 HELLO 0) #(0 0) #(42 0 0 0) #(0 0 0 0 WORLD))
42
Run Code Online (Sandbox Code Playgroud)