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

Re: Macros: One expression => more than one expression?

brk@jenkon.com writes:
 > 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))

 > I can't see any way to have the one expression expand into multiple
 > expressions.

I don't think there is in the general case, but in this particular
case you can wrap them in "begin":

(require (lib "class.ss"))
(define-syntax init-fields
  (syntax-rules ()
    ((_ fname ...)
     (begin (init-field fname) ...))))
(define a-class
  (class object%
    (init-fields foo bar baz)
    (define/public (sum) (+ foo bar baz))
    (super-instantiate ())))
(send (make-object a-class 1 2 3) sum)

=> 6

This doesn't appear to be documented-- the syntax for "class-clause"
should include:

    (begin class-clause ...)

although it's clear that this works from the example expansions of
"public*" and "define/public".