2010-12-08 6 views
5

두 질문 :common-lisp에서 목록에 요소를 삽입하려면 어떻게해야합니까?

1.I는 (어떤 위치에 있지만 목록의 시작의 이유 질문 2 참조) 기능은 현재 위치에서 목록 내부 요소를 삽입 할 같은 것을 :

CL> (defun insert-in-place (the-list after-position new-element) ....) => ... 
CL> (setf testy-list (list 'a 'b 'c 'd)) => ... 
CL> testy-list => ('A 'B 'C 'D) 
CL> (insert-in-place testy-list 1 'BOOOO) => ... 
CL> testy-list => ('A 'B 'BOOOO 'C 'D) 

2. args가 값으로 전달되기 때문에 함수를 통해 목록의 처음에 요소를 삽입 할 수 없으므로 목록의 첫 번째 cons 셀이 전달되므로 값으로 전달됩니다 사본이기 때문에 차를 변경하면 원본 차라는 것이 아니라 카피 카가 바뀝니다. 단, 다음 단락 셀은 공유되고 변경이 가능합니다. 나 맞아?

답변

8

1) 여기서는 다음과 반대의 셀

(defun insert-after (lst index newelt) 
    (push newelt (cdr (nthcdr index lst))) 
    lst) 
(insert-after '(a c d) 0 'b) => (A B C D) 

2) 파괴 변형 :

(setf testy-list '(a bar)) 
(defun modify (list) 
    (setf (first list) 'foo)) 
(modify testy-list) 
testy-list => (FOO BAR) 

이 foo를 '내지 제 반대 셀의 차를 설정한다.

+0

감사합니다. 질문 2 : 수정 (테스트 목록 수정)을 호출 할 때 정확히 무엇이 수정을 위해 전달되고 있습니까? 테스트리스트의 첫 번째 단락 셀은 값 또는 참조로 사용됩니까? 나는 당신이 정확하지 않다고 대답했음을 의미하지만 질문 2에 관한 나의 주장에서 결함을 발견 할 수 없다 ... – Paralife

+0

또한 나는 이것으로 스스로를 끝내었다 : (rplacd (nthcdr position lst) (cons elem (nthcdr (+ 1 position) lst)))) 하지만 당신이 더 낫습니다. 사실 나는 nthcdr을 설정하고 싶었지만 사용하는 clisp에서 nthcdr은 setfable이 아닙니다. 나는 그것이 setfable하게 만들 가치가 있는지 궁금해. 내 다른 질문을 참조하십시오 : http://stackoverflow.com/questions/4387967/does-a-setfable-nthcdr-implementation-exist – Paralife

+0

질문 2 : 당신이 (testy-list 수정) 호출하면 단점 셀 자체를 전달합니다 ("참조로"). – koddo

0

나는 이것을 내 프로젝트 용으로 만들었고, 인덱스 0을 처리하고, index가 list의 길이보다 길면,리스트의 끝에 새 아이템이 추가된다. 새로운 목록을 작성하므로 귀하에게 해당되지 않을 수도 있습니다. 나는 그것이 누군가에게 유용 할 것이기를 희망한다.

(defun list-insert-at (lst index new-value) 
    (let ((retval nil)) 
    (loop for i from 0 to (- (length lst) 1) do 
     (when (= i index) 
     (push new-value retval)) 
     (push (nth i lst) retval)) 
    (when (>= index (length lst)) 
     (push new-value retval)) 
    (nreverse retval))) 

CL-USER> test 
(1 2 3 4 5) 
CL-USER> (list-insert-at test 5 'a) 
(1 2 3 4 5 A) 
CL-USER> (list-insert-at test 0 'a) 
(A 1 2 3 4 5) 
관련 문제