[R6RS] Internal DEFINE vs. macros
dyb at cs.indiana.edu
dyb
Tue Apr 12 11:20:15 EDT 2005
> Kent> [...] I agree that making top-level and internal contexts behave
> Kent> similarly would be useful. What people usually mean by this is
> Kent> that internal contexts should behave like their favorite Scheme
> Kent> system's interactive top-level environment behaves [...]
>
> Ah, sorry, I should have said that more precisely:
>
> I didn't mean the interactive top-level, but rather the outermost
> level of the core language. This is inherently different from
> internal contexts because of shadowing. The semantics of this should
> be specified as precisely as that of internal contexts for the same
> reasons.
But I thought your notion of core language did not include top-level
definitions, just module forms. Forgive me from being dense, but doesn't
this mean that all definitions are internal?
> Kent> Yes, I can and will if I end up writing up a syntax-case
> Kent> proposal more formally. I believe it can be reasonably simple.
>
> Will that end up describing what Chez currently does? This kind of
> dichotomy confuses me, leaving aside for a moment the issue of
> ambiguity:
>
> (let-syntax ((bar (syntax-rules () (let ((bar
> ((bar) 'outer)))) (lambda () 'outer)))
> (define-syntax bar (define bar
> (syntax-rules () (lambda ()
> ((bar) 'inner))) 'inner))
> (bar)) (bar))
> => 'outer => 'inner
>
> Can you give a preview of how to explain this behavior?
I think you are running up against the fact that Chez Scheme does
not treat the forms within a let-syntax and letrec-syntax as bodies;
instead, let-syntax and letrec-syntax are treated like begin. This allows
let-syntax and letrec-syntax forms to be treated as definitions in the
same sense that begin is treated as a definition.
The example would be written instead like this:
(let-syntax ((bar (syntax-rules () ((bar) 'outer))))
(let ()
(define-syntax bar (syntax-rules () ((bar) 'inner)))
(bar)))
-> 'outer
Kent
More information about the R6RS
mailing list