문제

I understand that syntax-rules is a hygienic macro system, but I do not understand why this happens:

(define not (lambda (x) x))

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

(nand #f #t)

==> #f

Now, if I had redefined not after defining the macro, then (nand #f #t) returns #t. Why, if the macro system is supposed to be hygienic?

도움이 되었습니까?

해결책

The macro is expanded in the environment that existed at the time the macro was defined, not in the environment that existed at the time the macro was called. This has nothing to do with hygiene, which is the property that variables introduced by the macro are distinct from other variables with the same name that exist elsewhere in the program.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top