2017-03-05 114 views
0

我正在与使用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]] 

这不是我们想要的。现在Common Lisp有我们需要的支持来解决这个问题。不幸的是,我们只能和elisp一起工作。我的问题是,由于我们只有elisp,我们如何解决这个问题,我们只能在向量中设置一个向量。

喜欢:

[[0 0 0 5] [0 0 0 0] [0 0 0 0] [0 0 0 0]] 

回答

2

虽然普通的Lisp有multidimensional arrays,的Emacs Lisp仅具有vectors(一维阵列)。

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

你的问题表明的是,

(eq (aref m-array 0) (aref m-array 1)) 
==> t 

,因为你可能创建了m-array这样的:

(setq m-array (make-vector 5 (make-vector 5))) 

您需要创建m-array这样的:

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

你非常正确。我确实使用了make-vector。这使现在更有意义。 – Cameron

相关问题