[gambit-list] Newbie: define-macro question

Logan, Patrick D patrick.d.logan at intel.com
Thu Aug 18 14:10:51 EDT 2005

> In your opinion, is it appropriate to use a macro to abstract away
> repetitive boiler-plate code? Or is this better done in a procedure?

This is almost always a procedural abstraction rather than syntax,
especially for beginners with Lisp... better to spend a lot of time
with just procedural abstraction, higher-order functions, etc.

Syntactical abstraction I use for controlling the order of evaluation
and sometimes to put a pretty syntax around use of lambda.

The begin1 is an example of control.

An example of the latter use of pretty syntax... consider a scenario
where you are using a resource and you want some "before" and "after"
actions. The base level way to implement this is with higher-order
procedures. But who wants to write (lambda () ...) all the time? So on
top of this build some pretty syntax. For example...

(define (call-when-ready procedure)
  (wait-until-ready time-out)
  (if (not (ready?))
      (call-when-ready procedure)))

Use it like this...

  (lambda () 
    (display "I am glad this is finally ready!")

This is fine when someone else is generating the code for
you. Normally you might want to abstract the procedure as a sequence
of statements...

  (display "I am glad this is finally ready!")

And so when-ready is defined as a macro that calls call-when-ready...

(define-macro (when-ready . body)
     (lambda ()
       , at body)))


More information about the Gambit-list mailing list