Re: Problem with Pika's macro expander?

Matthew Dempsky <[email protected]> 25 Feb 2004 11:05:58 -0600
Newsgroups gmane.lisp.scheme.pika.devel
Message-ID <[email protected]>
Tom Lord <lord-1tv/[email protected]> writes:

> So that the pattern/template from LETREC
> 
> 	((letrec "gtn" 
>            (x y ...)
>            (temp ...)
>            ((var1 init1) ...)
>            body ...)
> 
>          (letrec "gtn"
>            (y ...)
>            (newtemp temp ...)
>            ((var1 init1) ...)
>            body ...))
> 
> can be translated to a transformer as:
> 
> 	(let ((y...         (cdr (list-ref exp 2)))
>               (temp...      (cdr (list-ref exp 3)))
>               (var1-init... (list-ref exp 4))
>               (body...      (cddddr (cdr exp)))
>               (_newtemp_    (hygenic-binding-of newtemp)))
> 
>           `(letrec "gtn" 
>               ,y... 
>               ,temp...
>               ,var1-init...
>               ,@ body...))

I think you actually meant (let bindings omitted):

          `(letrec "gtn" 
              ,y... 
              (,_newtemp_ ,@temp...)
              ,var1-init...
              ,@ body...))

Also, for the record, I'd like to point out that there should be just
one call to hygenic-binding-of per symbol when expanding a
syntax-rules clause.  For example, the following clause is part of the
R5RS syntax-rules definition of OR:

    ((or test1 test2 ...)
     (let ((x test1))
       (if x x (or test2 ...))))

It's important to expand that into:

    (let ((test1    (cadr exp))
          (test2... (cddr exp))
          (_let     (hygenic-binding-of let))
          (_x       (hygenic-binding-of x))
          (_if      (hygenic-binding-of if))
          (_or      (hygenic-binding-of or)))
        `(,_let ((,_x ,test1))
           (,_if ,_x ,_x (,_or ,@test2...))))

rather than:

    (let ((test1    (cadr exp))
          (test2... (cddr exp))
          (_let     (hygenic-binding-of let))
          (_x1      (hygenic-binding-of x))
          (_x2      (hygenic-binding-of x))
          (_x3      (hygenic-binding-of x))
          (_if      (hygenic-binding-of if))
          (_or      (hygenic-binding-of or)))
        `(,_let ((,_x1 ,test1))
           (,_if ,_x2 ,_x3 (,_or ,@test2...))))

I doubt the above would be a likely expansion that anyone would
generate, but equivalent semantics might be formed by a naive
implementation.

-jivera