[gambit-list] Request: examples of cool uses of macros

Fred Weigel fred_weigel at hotmail.com
Fri Jan 25 13:28:57 EST 2013


Jason

An example I use in idiomatic C (as taught in the K&R book, and in
"Software Tools")

int main(void)
{
  int c;
  while ((c = getchar()) != EOF) {
    putchar(c);
  }
  return 0;
}

and, with macros:

(define (main)
  (awhile c (read-char) (not (equal? c #!eof))
    (write-char c))
  (exit 0))

Note that the two pieces of code are pretty much identical
(from Paul Graham originally, I believe). Read (awhile) as "anaphoric
while". The definition of awhile is (Gambit-C define-macro low level
macros):

; anaphoric while
;
(define-macro (awhile var expr pred . body)
  (let ((loop (gensym 'loop)))
    `(let ,loop ()
      (aif ,var ,expr ,pred (begin , at body (,loop))))))

awhile, is pitching the "real" work to macro aif, which is:

; anaphoric if
;
(define-macro (aif var expr pred then #!optional else)
  `(let ((,var ,expr))
    (if ,pred ,then ,else)))

but (and this is a serious BUT), this is MUCH EASIER in Gambit-C:

(define EOF #!eof)
(define getchar read-char)
(define putchar write-char)

and now (the \ enters six mode):

\
int main()
{
  int c;
  while ((c = getchar()) != EOF) {
    putchar();
  }
  0;
}

but this is only possible with the "six" syntax of Gambit-C. But, of
course, six is implemented as macros anyway.

Tasty thought -- C is just macros (and some reader support) to translate
to Scheme... But it really isn't "C", it's a much higher order language,
that happens to have a great deal of syntax compatibility.

FredW

On Fri, 2013-01-25 at 09:47 -0500, Jason Felice wrote: 
> 
> Hi!
> 
> 
> Does anyone have any examples of macros which drastically improve
> readability or simplicity of code?  Maybe neat hacks?
> 
> 
> Not deep hacks that take a long time to understand, but things which
> can be used to illustrate why macros are powerful and awesome.
> 
> 
> Background:
> 
> 
> I'm giving a talk tomorrow on Scheme to prisoners in a job training
> program. The purpose is to expand their brains by exposing them to
> concepts they haven't seen before (they don't have Internet access).
> 
> 
> The talk is about Scheme and "Code is Data".  I've laid the
> foundation, but am getting to the point where I want to have some
> flashy and interesting uses of macros.
> 
> 
> Any help would be appreciated.
> 
> 
> Thanks,
> -Jason
> _______________________________________________
> Gambit-list mailing list
> Gambit-list at iro.umontreal.ca
> https://webmail.iro.umontreal.ca/mailman/listinfo/gambit-list




More information about the Gambit-list mailing list