Vector 如何在elisp中设置多维数组中的元素

Vector 如何在elisp中设置多维数组中的元素,vector,lisp,elisp,Vector,Lisp,Elisp,我正在与使用elisp的人合作,我们一直在努力使用多维数组 问题是,如果我们试图使用 (setf (elt (elt m-array 0) 0) 5)) 我们最终得到了这样的结果 [[0 0 0 5] [0 0 0 5] [0 0 0 5] [0 0 0 5]] 这不是我们想要的。现在,CommonLisp提供了我们所需的支持来解决这个问题。但不幸的是,我们只能与elisp合作。我的问题是,考虑到我们只有elisp,我们如何解决这个问题,从而在向量中只设置一个向量 比如: 虽然Common

我正在与使用elisp的人合作,我们一直在努力使用多维数组

问题是,如果我们试图使用

(setf (elt (elt m-array 0) 0) 5))
我们最终得到了这样的结果

[[0 0 0 5] [0 0 0 5] [0 0 0 5] [0 0 0 5]]
这不是我们想要的。现在,CommonLisp提供了我们所需的支持来解决这个问题。但不幸的是,我们只能与elisp合作。我的问题是,考虑到我们只有elisp,我们如何解决这个问题,从而在向量中只设置一个向量

比如:

虽然Common Lisp有,但Emacs Lisp只有(一维数组)

您正试图在ELisp中使用向量向量模拟多维数组(这确实是一个相当标准的技巧),但您需要小心避免“别名”——即,您需要确保嵌套数组不是相同的对象

你的问题是

(eq (aref m-array 0) (aref m-array 1))
==> t
因为您可能创建了如下
m-array

(setq m-array (make-vector 5 (make-vector 5)))
(setq m-array (make-vector 5 nil))
(dotimes (i 5)
  (setf (aref m-array i) (make-vector 5 0)))
您需要像这样创建
m-array

(setq m-array (make-vector 5 (make-vector 5)))
(setq m-array (make-vector 5 nil))
(dotimes (i 5)
  (setf (aref m-array i) (make-vector 5 0)))
虽然Common Lisp有,但Emacs Lisp只有(一维数组)

您正试图在ELisp中使用向量向量模拟多维数组(这确实是一个相当标准的技巧),但您需要小心避免“别名”——即,您需要确保嵌套数组不是相同的对象

你的问题是

(eq (aref m-array 0) (aref m-array 1))
==> t
因为您可能创建了如下
m-array

(setq m-array (make-vector 5 (make-vector 5)))
(setq m-array (make-vector 5 nil))
(dotimes (i 5)
  (setf (aref m-array i) (make-vector 5 0)))
您需要创建这样的
m-array

(setq m-array (make-vector 5 (make-vector 5)))
(setq m-array (make-vector 5 nil))
(dotimes (i 5)
  (setf (aref m-array i) (make-vector 5 0)))

你完全正确。我确实使用了makevector。现在说得更有道理了,你说得对。我确实使用了makevector。现在这就更有意义了。