At Tue, 3 May 2016 12:48:47 -0700, Matthew Butterick wrote:
> > Strangely, your Example #4 works the same as example #3, except in
> > DrRacket, where it errors.
> 
> It's always nice to share puzzlement ;)

The problem is in `expand` and definition contexts. The problem doesn't
affect `compile`, which expands and converts to an AST at the same
time. Since DrRacket uses `expand`, the problem shows up there when it
doesn't show up when running plain `racket`.

More specifically, the problem is in converting definitions to
`let-values` as opposed to `letrec-values`. If you have

 (define x^{s1,s2} 1)
 (define x^{s1} 2)
 x^{s1,s2}

then the expansion changes that to

 (let-values ([(x^{s1,s2}) 1])
   (let-values ([(x^{s1}) 2])   
     x^{s1,s2}))

The expander wants to convert to nested `let-values` bindings, because
there are no references to defined variables on the right-hand sides of
the definition.

Unfortunately, that expansion doesn't make sense: If the outer
`let-values` has been in the source program, it would have created an
extra scope on `x^{s1}` that does not appear in the binding
`x^{s1,s2}`. Re-expansion or compilation of the nonsensical expansion
runs into trouble:

 (let-values ([(x^{s1,s2}) 1]) ; binding scope s3 added to body
   (let-values ([(x^{s1,s3}) 2]) ; bining scope s4 added to body
     x^{s1,s2,s3,s4}))

At this point, `x^{s1,s2,s3,s4}` is ambiguous.

The solution may be to change the expansion of definition contexts so
it produces something like

 (let-values ([(x^{s3}) 1])
   (let-values ([(x^{s3,s4}) 2])   
     (letrec-syntaxes ([(x^{s1}) (make-rename-transformer #'x^{s3})]
                       [(x^{s1,s2}) (make-rename-transformer #'x^{s3,s4})]
                         
       x^{s1,s2}))))

which uses nestable identifiers for the `let-values` bindings.

----------------------------------------

On the original question of what to do with `syntax-local-introduce`:
the main use case is when an identifier X is passed to macro invocation
A, and A wants to squirrel X away somewhere not covered by the
expander's remarking of A's result.

For example, if A attaches X as a syntax property, then it might use
`syntax-local-introduce` to get a variant of X to attach so that it's
consistent with the provided X.

So far, I don't know how to specify `syntax-local-introduce` other than
by its interaction with the expansion algorithm. The uses I can think
of offhand are places that want to imitate the expansion algorithm in
some way.

-- 
You received this message because you are subscribed to the Google Groups 
"Racket Users" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to racket-users+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to