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.

