Section 4.5 of Abdulaziz Ghuloum's PhD thesis is the earliest description
I've seen of an algorithm:
https://www.proquest.com/openview/f6a12fd14db7fd3ea85cfebbf72e0bc5
It also does not provide much justification.
The second example you give becomes more natural if you've considered
simpler cases of macros in definition contexts first:
1. Macro-generated references may refer to locally defined names
(let ([x 'outer])
(define x 'inner)
(define-syntax-rule (m)
x)
(m))
2. Macros may abstract over define
(let ([x 'outer])
(define-syntax-rule (m a)
(define a 'inner))
(m x)
x)
3. Definitions splice out of begin, in order to allow macros to generate
multiple definitions
(let ([x 'outer] [y 'outer])
(define-syntax-rule (define2 a b)
(begin
(define a 'inner)
(define b 'inner))
(m x y)
(list x y))
>From there, your second example is a macro simultaneously abstracting over
a definition and referring to a locally defined name.
On Wednesday, July 28, 2021 at 1:31:25 AM UTC-6 [email protected] wrote:
> Hi all,
>
> I recently posted two tricky hygiene puzzles on Twitter
> <https://twitter.com/lexi_lambda/status/1420221128245714951>, reproduced
> below for completeness:
>
> (let ([x 'outer])
> (define-syntax-rule (m a)
> (let ([a 'inner]) x))
> (m x))
>
> (let ([x 'outer])
> (define-syntax-rule (m a)
> (begin
> (define a 'inner)
> x))
> (m x))
>
> The puzzle is to guess what these expressions evaluate to. I have
> discovered that people find the “correct” answer *remarkably*
> unintuitive—at the time of this writing, it is the single least popular
> choice in the poll!
>
> Despite this confusion, the Scheme implementations I’ve tried are
> unwaveringly consistent in their interpretation of these expressions:
> Racket, Chez, and Guile all agree on what the answers should be. This has
> led me to wonder where the original justification for these answers comes
> from, but I have been struggling to hunt down a source.
>
> Matthew’s 2016 paper, “Bindings as Sets of Scopes”, discusses examples
> like these ones in gory detail, but it gives no justification for *why*
> these results are the right ones, it simply takes their meaning for
> granted. Earlier papers on macro technology I have found do not discuss
> internal definitions, and no Scheme standard specifies the macro system,
> not even R6RS. Obviously, something at some point must have set the
> precedent for the handling of such macros, but I cannot figure out what it
> is.
>
> So, my question: when was hygiene for internal definitions first worked
> out, and did it make it into any papers, specifications, or documentation?
> Hopefully someone (probably Matthew) can provide some insight.
>
> Thanks,
> Alexis
>
--
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/ef3475e3-1b06-44f0-86e4-087dc57034fen%40googlegroups.com.