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

时间:2017-03-05 02:21:17

标签: 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]]

这不是我们想要的。现在Common Lisp得到了我们需要的支持来解决这个问题。不幸的是,我们只能使用elisp。我的问题是,鉴于我们只有elisp,我们如何解决这个问题,以便我们只在向量中设置一个向量。

像:

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

1 个答案:

答案 0 :(得分:2)

虽然Common 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)))