2013-04-05 4 views
1

Scheme의 파괴적인 조작에 대해 혼란스러워합니다. 이 전 목록과 지구 환경에 정의 된 일부 파괴적인 절차를 가지고 있다고 가정 해 봅시다 : 그럼스키마 환경의 파괴적인 조작

(define a '(a b c)) 
(define (mutate-obj x) 
    (set! x '(mutated))) 
(define (mutate-car! x) 
    (set-car! x 'mutated)) 
(define (mutate-cdr! x) 
    (set-cdr! x 'mutated)) 

우리가 다음과 같은 표현 evaulation :

(mutate-obj! a) a => (a b c) 
(mutate-car! a) a => (mutated b c) 
(mutate-cdr! a) a => (mutated . mutated) 

왜 외부 a에 영향을 가지고 있지 set! 자사의 절차는 set-car!set-cdr! 모두? 첫 번째 줄의 표현이 (mutated)으로 평가되지 않는 이유는 무엇입니까? 이 모든 것이 실제로 어떻게 작동합니까?

답변

0

첫 번째 예제는 상상했던대로 작동하지 않습니다. x 매개 변수와 a 전역 변수가 같은 목록을 가리키고 있지만 (set! x '(mutated))을 실행하면 x (프로 시저에 로컬 인 매개 변수)을 설정하여 다른 목록을 가리키고 a은 변경되지 않습니다.

(define (mutate-obj) 
    (set! a '(mutated))) 

지금 a이 절차 내에서 돌연변이됩니다 : 당신이 쓴 경우는 다른 것. 두 번째 및 세 번째 절차는 목록의 a 목록을 수정하는 것이며 x도 가리키고 있으므로 프로 시저가 반환되면 변경 내용이 "외부"에 반영됩니다.

+0

좋아요,하지만'set-car!'와'set-cdr! '는'a'에서'x'를 통해 어떻게 변형시킬 수 있습니까? –

+0

@htor 내 업데이트 된 답변 확인 –