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

Re: Namespaces

This page is part of the web mail archives of SRFI 72 from before July 7th, 2015. The new archives for SRFI 72 contain all messages, not just those from before July 7th, 2015.

> From: Andre van Tonder <andre@xxxxxxxxxxxxxxxxx>
> I have been wondering about the following technical issue:
>    (let ((x 1))
>      (let-syntax ((m (lambda (form)
>                        (let ((x 2))
>                          (syntax x)))))
>        (m)))
> There are two possibilities for what this should give, and I am
> trying to decide which would be the Right Thing.

     <crazy talk deleted>

> On the other hand, if there is a single namespace, we will get an
> "Identifier out of context error".  This is the answer that both
> Chez and MzScheme give.

They are both right, and I don't see how anyone can advocate
otherwise.  The whole point of hygienic macros is that the bindings
you think you see in the source code are the actual bindings.
The innermost binding occurrence of x is the one that binds.

RRRS requires that let-syntax bindings shadow let bindings,
in the sense that

   (let ((x 1))
      (let-syntax ((x (lambda(x) 12)))

is a call to the x macro, and so yields 12.  Why should a
let binding fail to shadow another let binding?

Perhaps modesty prevents you from saying it, but I can say
that the srfi-72 reference implementation gives:

    reference to undefined identifier: @x_799

presumably because it correctly renames x to match the innermost
binding so that the example expands to

    (let ((x 1)) @x_799)

Why would this be a problem?  If you want the outermost x then
use a different name for the innermost, just like you would if
the macro were not there at all.

     -- Keith Wright

Programmer in Chief, Free Computer Shop
 ---  Food, Shelter, Source code.  ---