YC wrote:
On Mon, Aug 9, 2010 at 6:00 AM, rafkind <rafk...@cs.utah.edu
<mailto:rafk...@cs.utah.edu>> wrote:
You need a (require (for-template scheme/base)) in the 'literal.ss' file
because the function is at phase 0 producing syntax at a lower phase
(-1,
which is template), so you need to import the bindings from
scheme/base for
that phase.
Ah - that solved it. Thanks!
So does (begin-for-syntax ...) automatically manage the above for the
function? I am trying to grok the difference but not sure if I got it:
1) when begin-for-syntax is used - the function is introduced in phase
1, which handles syntax matching at phase 0, so it works correctly
There are only three things that matter: 1) the phase of comparison, 2)
the binding of the macro transformer's literal at that phase, and 3) the
binding of the macro uses's literal at that phase.
In both cases, the macro is used at phase 0. More precisely, the macro
extends the phase-0 environment, which means it's implemented with a
phase-1 expression, but the important thing is that since it's used at
phase 0, the phase for literal comparison defaults to phase 0.
When begin-for-syntax is used, the macro's literal (the one in the
literals list) has a binding at phase 0 from the surrounding module. So
does the use, and so it works.
2) when (require (for-syntax)) is used - the function was defined in
phase 0, but is imported into phase 1... would it not handle syntax
matching at phase 0?
When require for-syntax is used, the module where the literal occurs is
at phase 1, so it only has a binding for the literal at phase 1. (The
function is at phase 0 *relative to its enclosing module*, but it's at
"absolute" phase 1.) Adding the require for-template (relative phase -1)
to the auxiliary module (at phase 1) adds a binding at the right
absolute phase, 0.
Ryan
Then is it the case that for-syntax does not "shift" the phase of the
function in question? So the function stays at phase 0 so it needs phase
-1 defined.
3) Is it a best practice then all such module should all have
(for-template ...) whether the functions have syntax-case literals
defined? It seems that the syntax-case matches the syntax shapes if
they do not involve literals (in the literal.ss it results in matching
of both the empty and the if clause), i.e. the only time I've noticed it
not working is when literals are involved.
Thanks.
yc
_________________________________________________
For list-related administrative tasks:
http://lists.racket-lang.org/listinfo/users