E. Moran writes: > Yep... Your version was very nearly correct, and I wouldn't have been able > to find a working solution if I hadn't seen that first. The missing piece > is basically dealing with macro hygiene: > > > http://docs.racket-lang.org/guide/pattern-macros.html#(part._.Lexical_.Scope) ... > Personally, I tend to think of macro hygiene as being like conservation > of energy---sort of a "conservation of identifiers." A macro can't > output an identifier that it didn't take in as input. (Unless we > explicitly override, like we're doing above.)
I didn't think about hygiene in this context, but as you describe it, it makes sense. (require ...) can indeed be considered a non-hygienic macro, since it injects bindings into a module that are not explicitly named. > Eli Barzilay's paper also helped a lot: > > http://barzilay.org/misc/stxparam.pdf Thanks for the pointer, that really looks interesting. I have added lots of comments to my minimalistic typed language implementation, in the hope that future language definers will be able to pick up from there: http://github.com/khinsen/racket-typed-lang Sam Tobin-Hochstadt writes: > I think what happens here is that the `require` that Konrad added was > getting the correct state initialized, but because of hygiene wasn't > the `require` that was binding the references to `foo`. Then Evan's > changes meant that the state and the binding were coming from the > correct place, and it works. > > At least that's what I think is going on -- the interaction of the > language position and syntax-time state still confuses me sometimes. That's reassuring, I feel less alone ;-) I figured out by now that Typed Racket is a stress test for the macro system. And I am confident that in a couple of years the macro system will evolve to make all this more transparent. Konrad. ____________________ Racket Users list: http://lists.racket-lang.org/users