[Larceny-users] define-macro library

Eduardo Cavazos wayo.cavazos at gmail.com
Fri Feb 13 18:37:54 EST 2009


Hello,

So, I've seen a few "define-macro using syntax-case" implementations 
floating around. This one loads and works for simple cases. But it has 
trouble when you reference non-rnrs-base functions in the body.

For example, this works:

----------------------------------------------------------------------
 > (define-macro (test-macro a) `(list ,a))

 > (test-macro 10)
(10)
----------------------------------------------------------------------

but this doesn't:

----------------------------------------------------------------------
 > (define (sq n) (* n n))

 > (define-macro (test-macro-sq a) `(list (sq ,a)))

 > (test-macro-sq 10)

Syntax violation: invalid reference

No binding available for sq in library (define-macro)
----------------------------------------------------------------------

Any suggestions?

Ed

----------------------------------------------------------------------
(library

  (define-macro)

  (export define-macro)

  (import

   (for (rnrs base) run expand)

   (for (rnrs syntax-case) run expand)

   )

(define-syntax define-macro
    (lambda (x)
      (syntax-case x ()
        ((_ (name . args) . body)
         (syntax (define-macro name (lambda args . body))))
        ((_ name transformer)
         (syntax
          (define-syntax name
            (lambda (y)
              (syntax-case y ()
                 ((_ . args)
                  (datum->syntax
                   (syntax _)
                   (apply transformer
                          (syntax->datum (syntax args)))))))))))))

  )

----------------------------------------------------------------------



More information about the Larceny-users mailing list