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... (call-when-ready (lambda () (display "I am glad this is finally ready!") (newline) (do-something))) 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... (when-ready (display "I am glad this is finally ready!") (newline) (do-something)) And so when-ready is defined as a macro that calls call-when-ready... (define-macro (when-ready . body) `(call-when-ready (lambda () ,@body))) -Patrick