2017-03-05 5 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만을 가졌다는 것인데, 우리가 대신 벡터에서 하나의 벡터를 설정하는 것과 같이 이것을 해결할 수있는 방법은 무엇인가.

처럼 :

커먼 리스프는 multidimensional arrays을 가지고 있지만, 이맥스 리스프는 vectors (한 차원 배열)가
[[0 0 0 5] [0 0 0 0] [0 0 0 0] [0 0 0 0]] 

답변

2

.

벡터의 벡터를 사용하여 ELisp에서 다차원 배열을 에뮬레이트하려고합니다 (실제로는 표준 트릭입니다).하지만 "앨리어싱"을 피하려면주의해야합니다. 즉, 중첩 배열은 동일한 객체가 아닙니다. 귀하의 문제가 나타냅니다

이다

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

아마 당신은이처럼 m-array 생성하기 때문에 그 :

(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))) 

을 정확히 맞아. 나는 make-vector를 사용했다. 이제 훨씬 더 의미가 있습니다. – Cameron