[racket] Expander vs Reader layer and general Macro advice

From: Eli Barzilay (eli at barzilay.org)
Date: Mon Sep 9 12:51:44 EDT 2013

A few minutes ago, Ryan Culpepper wrote:
> On 09/09/2013 10:06 AM, Eli Barzilay wrote:
> > An hour ago, Jay McCarthy wrote:
> >> You can do this a complicated way and an easy way. The complicated
> >> way would have to deal with stuff like (f 1):5 and the easy way
> >> would just work on stuff like x:1. I see "string":e as being part of
> >> the complicated way. In my mind, the complicated way would have to
> >> be done with a reader that produced some syntax that the expander
> >> dealt with the rest of. The easy way would just be a #%top macro
> >> like you have.
> >
> > There's a much easier way: use the built-in reader, then scan the
> > resulting syntax tree and tweak occurrences of `? : ?'.  This of
> > course requires spaces around all `:'s -- but dealing with that should
> > be simple now: change the default reader table to make `:' a
> > terminating reader macro, and make it consume just the colon and
> > produce itself as an identifier for the previous hack to continue
> > working.
> What does
>    (a b #; c:d e)
> read as?

Obviously, with just the simple first hack you get something different
than the one with the slightly more complicated reader extension.

> Adding an infix S-expression syntax means that you now have to worry
> about its precedence relative to all of the prefix syntaxes.

Exactly.  (And the lack of real precedence in the sexpr syntax
complicates things since you usually don't get a choice, unless you
are going with a whole new reader.)

> (Maybe that's what you meant to point out below, but the example should 
> be 'x:y, not '(x:y), I believe.)

Not really, I was pointing at the simpler problem of the kind of
post-reader processing that I talked about -- if you do some "manual"
conversion of x : y to (cons x y), then you get nasty surprises when
you have that inside a quoted context.  This was actually one of the
major problems with designing the @-syntax, which is handled nicely by
making nested @s mean the same as they are on the outside.

The 'x:y problem is arguably tricker (though perhaps less subtle) and
is the same issue as in the @;x:y case.

          ((lambda (x) (x x)) (lambda (x) (x x)))          Eli Barzilay:
                    http://barzilay.org/                   Maze is Life!

Posted on the users mailing list.