From: Bruno H. <br...@cl...> - 2003-08-12 12:15:54
|
Sam wrote: > here is another example: > > (symbol-macrolet ((foo 12)) > (macrolet ((bar (x y) `(+ ,x ,(1+ y)))) > (bar 10 foo))) > > see > <http://groups.google.com/groups?dq=&hl=en&lr=&ie=UTF-8&threadm=sfwn0eifn0s >.fsf%40shell01.TheWorld.com&prev=/groups%3Fas_ugroup%3Dcomp.lang.lisp> for > some discussion - it appears that indeed the first form should macroexpand > to 22 and the second to (+ 10 13). About the second form, I don't agree. During the macroexpansion call, X gets bound to 10 Y gets bound to the symbol FOO and then you just write (1+ y) - it must give an error "FOO is not a number". Remember that no processing occurs to macro arguments before the macro expander is invoked (except the destructuring, provided by DEFMACRO and MACROLET). See CLHS 3.1.2.1.2.2. The citation about "The macro-expansion functions defined by macrolet are defined in the lexical environment in which the macrolet form appears." only means that you can write (symbol-macrolet ((foo 12)) (macrolet ((bar (x) `(+ ,x ,(1+ foo)))) (bar 10))) Bruno |