2012-01-19 5 views
3

나는 syntax-rules는 위생 매크로 시스템 이해하지만 이런 일이 발생하는 이유는 이해가 안 :구문 규칙이 완전히 위생적이지 않은가?

(define not (lambda (x) x)) 

(define-syntax nand 
    (syntax-rules() 
    ((_ a b) 
    (not (and a b))))) 

(nand #f #t) 

==> #f 

자, 매크로, 다음 (nand #f #t) 반환 #t을 정의 후 not를 재정의 한 경우. 왜 매크로 시스템이 위생적이라면?

답변

4

매크로는 매크로가 정의 된 시점의 환경에서 확장되었으며 매크로가 호출 된 시점의 환경에서는 확장되지 않았습니다. 이것은 위생과는 아무런 관련이 없습니다. 이것은 매크로에 의해 도입 된 변수가 프로그램의 다른 곳에있는 같은 이름을 가진 다른 변수와 구별되는 속성입니다.

+4

이 질문은 또한 최상위 환경에 관한 질문으로 이어지고 있습니다. 예를 들어, Racket에서는 'not'의 정의가 모든 모듈의 범위에 있으므로 #f를 얻을 수 있습니다. @ user448810처럼, 이것은 위생에 관한 질문이 아닙니다. –

+2

@ user448810 - "이것은 위생과는 아무런 관련이 없습니다"- 완전히 정확하지는 않습니다. 실제로, 참조 투명성 (이는 질문에서 실제로 요구되는 것임)은 일반적으로 위생적 매크로의 속성이라고합니다. 참조 : http://community.schemewiki.org/?scheme-faq-macros –