[gambit-list] Intermixing syntax-rules and define-macro

Bradley Lucier lucier at math.purdue.edu
Thu Sep 27 18:42:36 EDT 2012


Here is an example from

http://c2.com/cgi/wiki?DefineSyntax

;; Common-lisp-style define-macro, implemented on top of syntax-case.
  ;;
  ;; Note that this is a macro that generates another macro (with the
  ;; appropriate name).
  ;;
  ;; This is the weirdest one.  It...
  ;;  * strips all syntax information out of the incoming s-exp,
  ;;    leaving raw symbols.
  ;;  * runs the result through the transformer function
  ;;  * injects that result back into the original scope
  ;;  * returns the final result for processing
  ;;
  ;; Note that because we're generating the *entire* result through
  ;; DATUM->SYNTAX-OBJECT, we don't need to quote or expand anything
  ;; with SYNTAX.
  (define-syntax define-macro
    (lambda (stx)
      (syntax-case
       stx ()
       ((_ (macro . args) . body)
        (syntax (define-macro macro (lambda args . body))))
       ((_ macro transformer)
        (syntax (define-syntax (macro stx2)
                  (let ((v (syntax-object->datum stx2)))
                    (datum->syntax-object stx2
                                          (apply transformer (cdr v))))))))))

Maybe you could use this to redefine Gambit's define-macro.

HTH.

Brad



More information about the Gambit-list mailing list