Prima di tutto, delta
è fuori (non dovrebbe corrispondere alpha
) perché si lega chiaramente lessicalmente alpha
ad un'altra vincolante rispetto a quello in base al quale i tuoi sytnax-rules
appare. I più interessanti sono beta
e gamma
.
Come da sezione 5.2.2. di R4RS (pagina 13) e R5RS (pagina 16), sezione 5.3.2. di R7RS (pagina 26) e sezione 11.3. di R6RS (p 32), la "regione" di un'associazione stabilita tramite una definizione interna è l'intero <body>
in cui la definizione appare. E la tua macro chiamata a foo
è chiaramente all'interno dello stesso <body>
come quelle definizioni interne.
R7RS va anche un po 'oltre e ci avverte:
Si noti che un tale organismo [vale a dire quello che contiene le definizioni interne] potrebbe non essere evidente fino a dopo l'espansione di altre sintassi.
Quindi l'ordine incasinato degli eventi è ammesso, ma non c'è ambiguità; il tuo syntax-rules
non deve corrispondere al ramo alpha
se esiste un collegamento per alpha
da una definizione interna nello stesso <body>
come chiamata alla macro. Pertanto, anche beta
e gamma
sono fuori.
Appendice A
Se abbiamo complicato la situazione ulteriormente, e la vostra stessa macro condizionale legati alpha
, come
(syntax-rules (alpha)
((_ alpha x) (define alpha x)))
allora sembra veramente ambiguo al primo pensiero, ma credo che questo sia risolto attraverso il fatto che l'espansione macro rinominerà l'identificatore alpha
definito per l'igiene, il che significa che non staremmo ombreggiamo il alpha
che stiamo corrispondendo come un valore letterale, quindi la corrispondenza va bene, e e sopra semplicemente creerà un binding per un rinominato alpha
che non è raggiungibile al di fuori del corpo della macro.
Appendice B
C'è un vincolo alla fine del paragrafo 5.3. di R5RS (pagina 17), alla fine della sezione 5.4. di R7RS (pagina 26) e la parte centrale della sezione 10. in R6RS (pagina 30), che menziona che una sequenza di definizioni non deve contenere una definizione che modifichi il significato di ognuna di esse. (In realtà è un po 'più complicato, tutti e tre gli standard utilizzando formulazione diversa, ma che dovrebbe essere una sintesi ragionevole.)
Nel tuo esempio, non è chiaro se la possibilità del vostro syntax-rules
espansione per una sintassi conteggio degli errori come un'ambiguità del suo "significato". Se lo si considera un'ambiguità, allora i tuoi beta
e gamma
sono "errori" (comportamento non definito) come da R5RS e R7RS e una "violazione della sintassi" come da R6RS.
Se il vostro esempio conteneva un'altra vincolante nel secondo ramo del syntax-rules
(idealmente una definizione per la stessa variabile, anche), allora questo nitpick non si applica, quindi la tua domanda sorge.
In R6RS (impl base psyntax), ottengo lo stesso comportamento quando si chiama le procedure. – leppie