[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Macros: One expression => more than one expression?

I was playing around with classes in DrScheme last night, and I made a
number of classes that had one or more (init-field)s in them. After a while
I got tired of the typing, and defined a macro like this:

(require (lib "defmacro.ss"))

(define-macro (init-fields . fields)
  (map (lambda (x) `(init-field ,x)) fields))

Which wasn't quite right. What I wanted was to be able to type:

(class object%
	(init-fields foo bar baz))

and get:

(class object%
	(init-field foo)
	(init-field bar)
	(init-field baz))

But of course my macro produces:

(class object%
	((init-field foo)
	 (init-field bar)
	 (init-field baz)))

which doesn't work at all...

I can't see any way to have the one expression expand into multiple
expressions. Hopefully there's something obvious I'm missing here? I know I
could do it by making my own class macro that would handle (init-fields)
itself with unquote-splicing, but that's not my question. Can I make a macro
that expands into more than one expression, without any special support from
the enclosing context?


Bryn Keller
Senior Software Engineer