[plt-scheme] macro-generating macros and the bizarre properties of syntax-local-get-shadower

From: Matthew Flatt (mflatt at cs.utah.edu)
Date: Mon May 14 22:22:34 EDT 2007

At Mon, 14 May 2007 22:06:27 -0400 (EDT), Dimitris Vyzovitis wrote:
> On Tue, 15 May 2007, Matthew Flatt wrote:
> 
> > At Mon, 14 May 2007 21:38:39 -0400 (EDT), Dimitris Vyzovitis wrote:
> > > On Tue, 15 May 2007, Matthew Flatt wrote:
> > >
> > > > I looks like Ryan and I replied at about the same time. Read Ryan's
> > > > first, and then read mine as an elaboration of this paragraph in Ryan's
> > > > message:
> > > >
> > > > At Mon, 14 May 2007 18:19:58 -0400, Ryan Culpepper wrote:
> > > > > When this macro is called, it looks up the value associated with 
> 'foo1':
> > > > > that's the number 1. Then it tries to turn it into an expression with
> > > > > that quasisyntax business. But doing it that way doesn't give it a
> > > > > '#%datum' binding, and that leads to the syntax error.
> > >
> > > I understand the problem. I see it is an instance of the more general
> > > problem of meta-level transformer environments.
> >
> > No, not at all. The `generate-temporaries' procedures returns
> > identifiers that have no initial context in any phase. That's not
> > because it has trouble importing bindings into various phases, but
> > because it cannot guess the context where you're going to use the
> > temporary identifiers.
> 
> Well, the same issue appears without gentemps in quite a few cases.
> The example was rather contrived as it was extracted from a much
> bigger and complicated piece of code.
> [among others it involves  macro-generated define-match-expanders which
> are particularly nasty pieces and don't even need quasisyntax to bork]
> 
> Most of the times it can be side-stepped with careful placement of
> context-providing operations, but it becomes difficult in complicated
> code; I really shouldn't have to do this just to get standard
> functionality in the meta-transformer environment.

Yes. And I agree with your point that MzScheme should provide something
like `require-for-phase'; that will happen sooner or later.

Matthew



Posted on the users mailing list.