Other Macro Systems
Hygienic pattern templates Chez, Guile, Racket, R6RS Hygienic, procedural, syntax objects
Explicit renaming (er-macro-transformer) CHICKEN, Chibi, MIT, Gauche
Manual hygiene: rename identifiers you introduce Implicit renaming (ir-macro-transformer) CHICKEN, Chibi
Automatic renaming; inject to capture intentionally Syntactic closures (sc-macro-transformer) Close expressions over environments define-macro / defmacro Guile, Gambit, many Unhygienic (Common Lisp style)
;; CHICKEN / Chibi: explicit renaming
(define-syntax swap!
(er-macro-transformer
(lambda (form rename compare)
(let ((a (cadr form)) (b (caddr form)) (%let (rename 'let)) (%set! (rename 'set!)) (tmp (rename 'tmp)))
`(,%let ((,tmp ,a)) (,%set! ,a ,b) (,%set! ,b ,tmp))))))
;; Guile: unhygienic define-macro (use gensym to avoid capture)
(define-macro (my-inc! var) `(set! ,var (+ ,var 1)))