2009-11-14 5 views
3

제목은 자명하다. 어떻게 다른 목록 Y (동일한 구조)에서 새 목록 X를 만들 수 있습니까? 결과 목록은 실제로 메모리 영역의 다른 곳을 가리키고 있습니까? make-list :initial-element Y으로 시도했거나 빈 목록에 추가했지만 동일한 객체가 계속 나타납니다. 감사!다른 곳을 가리 키도록 새 목록을 만드는 방법, Lisp

답변

3

아마도 COPY-LIST를 사용하고 싶을 것입니다.

+0

예, 여기 있습니다. 새 목록의 위치를 ​​설정하면 첫 번째 위치는 변경되지 않습니다. 감사. – PCManticore

+0

실제로 list-in-list를 사용하면 문제가 남아 있습니다. 예를 들어, a '((1 2 3) (4 5 6))와 b를 a의 사본으로하면, setf (n 번째 0 (nth 0 b)) "4"는 두리스트 모두를 변경합니다. – PCManticore

+0

가장 많이 올려 진 댓글에주의를 기울이거나 HyperSpec을 읽습니다. COPY-LIST는 * list * 만 복사합니다 - 최상위 레벨에 대한 새로운 cons를 작성한 다음 이전 데이터를 가리 킵니다 (이전 데이터가 다른 cons와 같은 포인터 인 경우 두리스트간에 공유 됨) . COPY-TREE는 구조를 통해 반복되고 모든 레벨에서 신선한 cons를 작성하지만 다른 유형의 복잡한 데이터 구조는 여전히 공유 될 수 있습니다. 이렇게하기 위해서는 * 일반적인 복사 기능과 같은 것이 없기 때문에 당신 자신의 함수를 작성해야한다. – Xanthir

12

커먼 리스프

사용 COPY-LIST은 첫 번째 목록 수준을 복사합니다.

COPY-TREE을 사용하여 conses 트리를 복사하면 다단계 목록이 모든 수준에서 복사됩니다.

COPY-TREE 및 COPY-LIST는 모두 괄호 만 복사하며 다른 것은 복사하지 않습니다. 목록의 내용은 동일하게 유지됩니다 (EQ가 아니라 EQL을 의미 함).

이러한 기능과 관련 기능은 Common Lisp HyperSpec의 The Conses Dictionary을 참조하십시오.

0

내 사본 목록 (sbcl 사용)이 작동했습니다.

REPL : 당신은 우리에게 우리가 도움을 줄 수 이상의 소스를 준 어쩌면 경우

(defvar a '((1 2 3) (4 5 6))) 

(defvar b (copy-tree a)) 

(setf (nth 0 (nth 0 b)) "4") 

a 

; ((1 2 3) (4 5 6)) is returned 

b 

;(("4" 2 3) (4 5 6)) is returned 

.