I have done some further digging. Looks like it is non-trivial to remove 
the top-level-bind-scope and still preserve the current behaviors of 
top-level `define-values` and `define-syntaxes`. In particular, through 
`as-expand-time-top-level-bindings` in "expander/expand/bind-top.rkt", both 
top-level `define-values` and `define-syntaxes` use 
`select-defined-syms-and-bind!/ctx` from "expander/expand/def-id.rkt", 
which selects variable-symbols and binds them at the same time. So after a 
variable symbol is selected, a binding must be created for it. For 
top-level `define-values` and `define-syntaxes`, using the 
top-level-bind-scope for that mandatory binding is necessary to achieve the 
current top-level behaviors. On the other hand, uses of the 
top-level-bind-scope that are related to `#%top` (such as in 
"expander/expand/expr.rkt" and "expander/expand/main.rkt") appear to be 
non-essential, but may offer minor performance advantages (really not sure).

On Tuesday, March 24, 2020 at 2:15:32 AM UTC-4, Yongming Shen wrote:
>
> 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/09bf14a5-1c1c-4718-80d7-c4414bf98d52%40googlegroups.com.

Reply via email to