On Oct 1, 2009, at 4:01 PM, Casey Klein wrote:

Can someone explain why this macro expands without error in a module
but not in the REPL?

(define-syntax (m stx)
(syntax-case stx ()
  [(_ x)
   (with-syntax ([(y) (generate-temporaries (syntax (x)))])
     (syntax (define (y) y)))]))

(m q)
compile: unbound identifier (and no #%top syntax transformer is bound) in: q1

Here's what I think is going on:

When you evaluate (m q) at the repl, you're *compiling* the whole term before you *execute* it. That means that the body of the definition is compiled before the definition takes effect. If the definition had taken effect, the reference to 'q1' (the generated name) would be okay, because there would be an entry for it in the compilation environment. But since the definition hasn't been *executed* yet, there is no such environment entry. That leads to '#%top' and craziness.

To back up my analysis, here's a variation of the macro. Because of begin-splicing etc etc, the definition is *executed* before the 'set!' expression is *compiled*. And it works. (Or so it seems.)

(define-syntax (m stx)
  (syntax-case stx ()
    [(_ x)
     (with-syntax ([(y) (generate-temporaries (syntax (x)))])
       (syntax (begin (define (y) #f)
                      (set! y (lambda () y)))))]))

Ryan




_________________________________________________
 For list-related administrative tasks:
 http://list.cs.brown.edu/mailman/listinfo/plt-dev

_________________________________________________
 For list-related administrative tasks:
 http://list.cs.brown.edu/mailman/listinfo/plt-dev

Reply via email to