如何在elisp中设置多维数组中的元素
How to set an element in a multi-dimensional array in 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]]
而 Common Lisp 有 multidimensional arrays, Emacs Lisp has only vectors(一维数组)。
您正在尝试使用向量的向量在 ELisp 中模拟多维数组(这确实是一个相当标准的技巧),但您需要小心避免 "aliasing" - 即,您需要确保您的嵌套数组不是相同的对象。
你的问题表明
(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)))
我正在与使用 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]]
而 Common Lisp 有 multidimensional arrays, Emacs Lisp has only vectors(一维数组)。
您正在尝试使用向量的向量在 ELisp 中模拟多维数组(这确实是一个相当标准的技巧),但您需要小心避免 "aliasing" - 即,您需要确保您的嵌套数组不是相同的对象。
你的问题表明
(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)))