[plt-scheme] Getting Serious with Learning Macros
2009/9/16 Doug Williams <m.douglas.williams at gmail.com>:
> I'm finally getting serious about using complex macros for (properly)
> parsing and processing domain specific languages in PLT Scheme. To date, I
> have just been using syntax-rules to do the minimum parsing needed to break
> out the basic elements of a construct and generate code that passes them to
> the code that does the real work at run-time. This is relatively easy to
> write, but pretty much limits error messages to 'bad syntax', which isn't
> real useful. But, I haven't found any really good tutorial material to help
> me get started.
>
> So first, can anyone point me to some good material to get started with
> syntax-case, define-for-syntax, and so on for doing this right? I've gotten
> started by looking at things like package.ss (in the scheme collection) that
> have some complex macros.
If I had to pick three:
Syntactic abstraction: the syntax-case expander.
R. Kent Dybvig. In Andy Oram and Greg Wilson, Beautiful Code: Leading
Programmers Explain How They Think, 407--428, June 2007
http://www.cs.indiana.edu/~dyb/pubs/bc-syntax-case.pdf
Writing Hygenic Macros in Scheme with Syntax-Case - Dybvig
ftp://ftp.cs.indiana.edu/pub/scheme-repository/doc/pubs/iucstr356.ps.gz
ICFP 2002 Flatt.
Composable and Compilable Macros: You Want it When?
http://www.cs.utah.edu/plt/publications/macromod.pdf
An exaxmple/exercise I learned a lot from, seems simple,
but an understanding of modules and phases is necessary.
(define-constant foo 42)
(+ foo 1)
should expand to (+ 42 1).
The tricky part is to handle the following sitatutions with custom error
messages:
1)
(define-constant foo 42)
(define-constant foo 43)
(+ foo 1)
Error: The same constant is defined twice.
2)
In module A: (define-constant foo 42)
In module B: (define-constant foo 43)
In module C importing both A and B: Error message: The constant foo is
defined twice.
3)
(defiine-constat foo 42)
(set! foo 42)
Error: foo is a constant.
--
Jens Axel Søgaard