On Aug 16, 2011, at 5:42 PM, Sam Tobin-Hochstadt wrote: > On Tue, Aug 16, 2011 at 5:31 PM, Matthias Felleisen > <matth...@ccs.neu.edu> wrote: >> >> Eli is right in principle. I sense that we are facing the same kind of >> problems we faced when we created mixins and then again when we created >> continuation marks. We need annotations time and again and they couple >> parts of our system more closely than necessary. Problem is, we don't seem >> to see or have an abstraction that eliminates this coupling. > > Aren't syntax properties precisely this abstraction?
It is a mechanism and as such it is an abstraction. But is it the best possible abstraction? The use of symbols means the use of a protocol: "when I see 'x, I will perform action A." So the identity of the symbol is critical. And that means we're tying together the two (+) components that are subject to the protocol. If the symbol changes in one of them, the other one breaks (the type checker, the stepper). That's Dan's rule: don't use symbols to impose protocols. (Today's add1 day for Dan.) What you really want is a name (variable). So at a minimum, two components should rely on a shared module that exports a variable to be used instead of a symbol. Then you could use (gensym) and nobody could mess with the symbol. Identity would be enforced afresh every time you start the system. But once you introduce a random name, you see that you want some other mechanism that 'mixes' into the compilation process as needed. -- Matthias _________________________________________________ For list-related administrative tasks: http://lists.racket-lang.org/listinfo/dev