2017-04-24 3 views
0

DrRacket을 사용하고 있습니다.세트 사용 방법! 계획의 "무언가"에?

(define foo 1) 
(set! foo 2) 
foo ;;returns 2 

을하지만, 여기에 내가 foo는 2를 반환 할 :

이 작동

(define foo 1) 
(define (setmachine variable newvalue) 
    (set! variable newvalue)) 
(setmachine foo 2) 
foo ;; returns 1 

가 어떻게이 setmachine 일을 할 수 있습니까?

(define bla 10) 
(define test bla) 
(set! test 20) 

세 번째 라인은 무엇입니까 :

답변

2

내가 이렇게 상상? bla이 바뀌나요? 그것이 귀하의 setmachine이 어떻게 작동한다고 가정합니다.

(set! variable newvalue) 

이것은 variable라는 이름의 변수가 아닌 foo라는 이름의 변수를 변경합니다. 설정 기계가 작동하지만 원하는대로 작동하지 않습니다!

(define (setmachine variable newvalue) 
    (display variable)  ; displays the value to variable 
    (set! variable newvalue) ; changes the binding to the value of newvalue 
    (display variable))  ; displays the value of variable (same as newvalue) 

(define foo 1) 
(setmachine foo 2) ; displays 1, then 2 

variable 있지만 foo 개의 mutate했다 참조하십시오. 실제로 foo 대신 1을 전달하면 값으로 인수를 전달하므로 여전히 작동합니다. foo을 변경하도록 지시하지 않았습니다. 이를 수행하는 방법은 다음과 같습니다.

(define-syntax syntaxset 
    (syntax-rules() 
    ((_ name expression) 
    (set! name expression)))) 

(define foo 1) 
(syntaxset foo 2) 
foo ; ==> 2 

더 이상 절차가 아닙니다. 실제로 무슨 일 프로그램을 실행하기 전에 당신이 있기 때문에 작동하지 않습니다 2로 평가하는 코드에서 1의 모든 accurences를 다시 정의 (syntaxset 1 2)을하려고하면 라켓 지금 (set! foo 2)

(syntaxset foo 2)의 코드를 수정 한 것입니다 (set! 1 2)이되고 set!은 첫 번째 인수가 기호식이 될 것으로 기대합니다.

+0

대단히 감사합니다! 아주 잘 설명! 한 번만 define-syntax를 보았고 이제는 문서를 확실히 확인합니다. – Jalokoh