2017-03-05 117 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

相關問題