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)))