Hi Matthew,

Thanks for the explanations. But I'm still not convinced that the 
top-level-bind-scope is needed. This is my current understanding. The 
purpose of the  top-level-bind-scope is to support recursion better at the 
top level. But for the case of `(define-values (x) ...)`, if `x` is not 
defined yet, then implicit #%top in `...` will let `...` refer to `x`. If 
`x` is defined, then the old definition will be used by `...`. Either way, 
the top-level-bind-scope is not needed. For the case of `(define-syntaxes 
(x) ...)`. As you explained, a macro can naturally recursively refer to 
itself, simply because of how macro expansion works, so the 
top-level-bind-scope is again not needed for recursion. Is my understanding 
correct?


On Monday, March 23, 2020 at 10:05:12 AM UTC-4, Matthew Flatt wrote:
>
> At Mon, 23 Mar 2020 01:45:40 -0700 (PDT), Yongming Shen wrote: 
> > I tried the example you gave for my first question and it resulted in an 
> > error. 
>
> Oops --- you're right. I lost track of what we try to make work at the 
> top level. 
>
> > I think this is because `(define-values (x) ...)` expands `...` without 
> the 
> > top-level-bind-scope, even when expand-context-to-parsed? is #t 
> (according 
> > to expander/expand/top.rkt). Is this a bug? 
>
> Since the behavior goes far back, I think this is the behavior that we 
> decided to settle for. 
>
> > Related to your answer to my second question, `define-syntaxes` 
> similarly 
> > does not add the top-level-bind-scope when expanding `...`. Does this 
> mean 
> > that even for `define-syntaxes`, `...` won't use the 
> top-level-bind-scope 
> > binding(s) after all? 
>
> The way that evaluation, binding, and expansion are interleaved means 
> that a `define-syntaxes` macro can refer to itself in expansions. The 
> binding of an identifier in a macro template is resolved after the 
> macro is applied. 
>
> The difference with `define` is that the right-hand side is 
> expanded/compiled before `define` binds. 
>
> > A little bit off-topic, in the definition of define-values (in 
> > expander/expand/top.rkt), there is `(define-match m s ...)`, but for 
> > define-syntaxes it is `(define-match m disarmed-s ...)`. Is this 
> difference 
> > significant? Or does define-match not care whether `s` or `disarmed-s` 
> is 
> > used? 
>
> Using `disarmed-s` in the definition of `define-values` is probably 
> a better idea, and I'll look into that more. 
>
> It think it turns out not to matter, normally, because `define-values` 
> is transparent to syntax arming via `syntax-arm` with a #t second 
> argument (which is what the expander does). But it would be better to 
> not rely on that. 
>
>

-- 
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 [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/racket-users/97759d2c-4d94-422e-b984-5ec9001b0fca%40googlegroups.com.

Reply via email to