[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...
(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 ()
       , at body)))
-Patrick
    
    
More information about the Gambit-list
mailing list