2017-03-05 7 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しか持っていないことを考えれば、代わりにベクトル内に1つのベクトルを設定するだけで、どうすればこの問題を回避できますか?

評価:

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

答えて

2

共通Lispはmultidimensional arraysを有するが、Emacs Lispには、vectors(1次元配列)を有しています。

ベクトルのベクトルを使用してELispで多次元配列をエミュレートしようとしていますが(実際にはかなり標準的なトリックですが)、 "エイリアス"を避けるように注意する必要があります。ネストされた配列は同一のオブジェクトではありません。あなたがいる

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

:あなたはこのようなあなたのm-arrayを作成する必要が

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

:あなたは、おそらくこのようなあなたのm-arrayを作成したので

あなたの問題を示し、その

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

です正確に正しい。私はmake-vectorを使いました。それは今より多くの意味があります。 – Cameron