[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Macros; lexcial scope



I would like to know how you would expect macros to work in Scheme
or generally in a lexically scoped Lisp.
(I'm not talking about a specific Scheme implementation here)

Suppose Scheme supported something like ``define-macro'' with the same
syntax as ``define'', so that you could, for instance, write

   (define-macro (incr x) `(set! ,x (+ ,x 1)))

Now my question is whether macros are lexically scoped (like functions)
or whether macro expansion is performed in a purely syntactic way.

Consider the following example:

   (define x 1)
   (define-macro (m) x)

   (let ((x 2))
     (m))

Would you expect that (m) evaluates to 1 or to 2?  Yes, I know, if I had
written (define-macro (m) 'x), it would evaluate to 2.  However, in
both Common Lisp (using a different syntax, of course) and C-Scheme,
(m) returns 1 in the example above.
Thus, it looks as if the first time the macro body is evaluated, the
evaluation takes place in the lexical scope of the define-macro.

Now consider a slighly more complex example:

   (define x 1)

   (let ((x 2))
     (define-macro (m) x)
     (let ((x 3))
       (m)))

In both Common Lisp and C-Scheme, this evaluates to 1.  My mind boggles.
The macro is local to the outer let, why is the ``x'' inside the macro
body bound to the global variable?  Are macro always implemented like
this (in lexically scoped Lisps)?  If so, why?

[I'm sorry, if the answer to my question is obvious; I'm new to Scheme
and Lisp.]

--
Regards,
    Oliver Laumann, Technical University of Berlin, Germany.
    ...!pyramid!tub!net   or   net@TUB.BITNET
    ...!mcvax!unido!tub!net