Fw: [plt-scheme] macro question

From: Jos Koot (jos.koot at telefonica.net)
Date: Sat Jun 7 16:47:00 EDT 2008

 No, it is not a bug. I think you are programming at top level, where every
 variable that has no other binding is bound at top level.  Your problem
 would have been exposed when programming in modules.
> ----- Original Message ----- 
> From: "Michael Vanier" <mvanier at cs.caltech.edu>
> To: "Matthias Felleisen" <matthias at ccs.neu.edu>
> Cc: "mzscheme Mailing List" <plt-scheme at list.cs.brown.edu>
> Sent: Saturday, June 07, 2008 9:58 PM
> Subject: Re: [plt-scheme] macro question
>> I'm using 3.72[3m]; I didn't know that 4.0 was ready yet.  I may not know 
>> what I'm doing, but when I hit the "macro stepper" button it expands the 
>> entire Scheme file form-by-form.  When it gets to the get-stack-values 
>> macro calls it just expands them naively with no error messages.  I don't 
>> know if this is a bug in 3.72 or if I'm not doing it right.
>> Completely off-topic, I have to say that I am really keen on the idea of 
>> typed Scheme (which I haven't used yet, though I've read the paper).  I 
>> found that about 90% of the bugs in my code were stupid type errors. 
>> Contracts would probably have helped a lot too.
>> Mike
>> Matthias Felleisen wrote:
>>> Michael, when I run the macro stepper (in 4.0), I get
>>>> expand: unbound variable in module
>>>> es
>>> with high-lighting, exactly where I expected it. Same for RUN.
>>> Jos explained the why and the how to fix it.
>>> I'm surprised to hear that the macro stepper wouldn't show you this 
>>> error. What version are you using? What language?
>>> Thanks -- Matthias
>>> On Jun 7, 2008, at 5:17 AM, Michael Vanier wrote:
>>>> I've run into a problem with a macro I don't know how to solve.  Here's 
>>>> the macro:
>>>> (define-syntax get-stack-vals
>>>>   (syntax-rules ()
>>>>     ((_ n (env first rest) expr ...)
>>>>      (let*-values (((env stk) (es-values es))
>>>>                    ((first rest) (take n stk)))
>>>>        expr ...))))
>>>> Here's a use:
>>>> (define (do-def es)
>>>>   (get-stack-vals 2 (env first rest)
>>>>      (let ((sym (cadr first))
>>>>            (val (car first)))
>>>>        (if (symbol? sym)
>>>>            (let ((env2 (env-add env sym val)))
>>>>              (make-es env2 rest))
>>>>            (error "cannot define non-symbol: " sym)))))
>>>> which should expand to:
>>>> (define (do-def es)
>>>>   (let*-values (((env stk) (es-values es))
>>>>                 ((first rest) (take 2 stk)))
>>>>     (let ((sym (cadr first))
>>>>           (val (car first)))
>>>>       (if (symbol? sym)
>>>>           (let ((env2 (env-add env sym val)))
>>>>             (make-es env2 rest))
>>>>           (error "cannot define non-symbol: " sym)))))
>>>> and apparently does, at least according to the macro stepper.  However, 
>>>> when I call do-def I get an error message: "reference to undefined 
>>>> identifier: es".  This seems odd, because es is in scope at the macro 
>>>> expansion location.  Is the es in the get-stack-vals macro bound in the 
>>>> lexical scope of that macro?  All the other external identifiers in the 
>>>> macro are bound at the top-level, so it works either way for them.  If 
>>>> this is the case, how do I get es to be bound the way I want it to be? 
>>>> I realize that I'm trying to do something a bit naughty since I'm 
>>>> assuming a binding for es will exist at all macro expansion locations; 
>>>> alternative suggestions are welcome (other than "don't give up your day 
>>>> job").
>>>> I'm a macro newbie, so please be gentle ;-)  PLT Scheme's macro system 
>>>> is an intricate and beautiful thing that I'm just beginning to wrap my 
>>>> head around.
>>>> Mike
>>>> _________________________________________________
>>>>  For list-related administrative tasks:
>>>>  http://list.cs.brown.edu/mailman/listinfo/plt-scheme
>> _________________________________________________
>>  For list-related administrative tasks:
>>  http://list.cs.brown.edu/mailman/listinfo/plt-scheme

Posted on the users mailing list.