Re: hygiene when using multiple instances of a macro..? Andre van Tonder (08 Aug 2005 14:55 UTC)
Re: hygiene when using multiple instances of a macro..? Keith Wright (09 Aug 2005 02:28 UTC)
Re: hygiene when using multiple instances of a macro..? Andre van Tonder (09 Aug 2005 11:49 UTC)
Re: hygiene when using multiple instances of a macro..? Panu A. Kalliokoski (09 Aug 2005 07:00 UTC)
Re: hygiene when using multiple instances of a macro..? Andre van Tonder (09 Aug 2005 13:53 UTC)

Re: hygiene when using multiple instances of a macro..? Andre van Tonder 09 Aug 2005 13:53 UTC

On Tue, 9 Aug 2005, Panu A. Kalliokoski wrote:

> On Mon, Aug 08, 2005 at 10:55:51AM -0400, Andre van Tonder wrote:
>>
>>   (define-syntax (can-we-stand-duplicates a-macro)
>>     (quasisyntax
>>      (if ',a-macro                     ; note quote
>>          (let ((x 3)) (,a-macro #f))
>>          x)))
>
> I don't understand why the quote is needed, though; and it seems I was
> not the only one...

Without the quote, one would get the expansion (I have kept the LETs for
readability)

   (if can-we-stand-duplicates
       (let ((x#1 3))
          (if #f
              (let ((x#2 3)) (#f #f))
              x))
       x)

but can-we-stand-duplicates is a macro, not a runtime value, and is
therefore unbound in the above expression (to an extent this can be regarded as
an implementation-dependent detail, since one could legitimately also have
expected t to be bound to a transformer even at runtime).

> Ah, so it's the _expansion_ that creates the new colour for the
> (quasi)syntax form.  Great.

Well almost :)  Each evaluation of (quasi)syntax, even if they occur
during the same macro expansion step, creates a new colour, so

   (bound-identifier=? (syntax x) (syntax x))  ;==> #f

> Another point that crossed my mind was the difference between
>
> (lambda (form) (quasisyntax (,(cadr form) 'foo 'bar)))
> and
> (lambda (form) (quasisyntax ,((cadr form) 'foo 'bar)))
>
> when (cadr form) is a macro; that is, does it make any difference
> whether the macro is left for the expander for further expansion or
> called directly, reentrantly?

Only the first example will work.  In the second example, you are attempting to
apply (cadr form) to arguments 'foo and 'bar.  Since (cadr form) evaluates to a
piece of syntax, not a procedure, this will fail.

Cheers
Andre