Subject: Re: Macros in Common Lisp, Scheme, and other languages
From: Erik Naggum <>
Date: 07 Sep 2002 04:29:29 +0000
Newsgroups: comp.lang.lisp,comp.lang.scheme,comp.lang.functional
Message-ID: <>

* (P.M.)
| Can you explain what compiler-macros are and how they differ from
| ordinary macros?

  There are two important differences.  The first is that they are defined in
  addition to the function, which remains available for normal calls.  The
  second is that they /may/ rewrite a function call at compile-time to
  redirect the call to a different (such as a more type-specific) function or
  to inline the operation with system- or implementation-specific forms.  The
  significance of the /may/ is that a compiler macro may decline to rewrite
  the form, in which case the original function call remains.

  An ordinary macro is, as you may know, always expanded and it is impossible
  to call it indirectly.  The compiler-macro combines the power of rewriting
  with an actual function.  A compiler-macro is more useful in the presence of
  environment information, such that it can know the declared or inferred type
  of variable bindings and act on such knowledge.  One particularly nice way
  to use compiler macros is in combination with keyword arguments; because
  they can be expensive to use in functions that need only a subset of the
  full functionality, a compiler macro can detect the actual keywords used and
  call the applicable specialized function.  E.g., the general function `member´
  may have specialized functions according as the `:key´ or `:test´ arguments
  reflect common usages, like `:key #'car´ or `:test #'string=´.

| Compile-time computation sounds a bit like template metaprogramming in C++.

  Template meta-programming is compile-time computation, but I am not quite
  sure how templates work.  I have not programmed in C++ for about a decade,
  and it was much less involved then.

Erik Naggum, Oslo, Norway

Act from reason, and failure makes you rethink and study harder.
Act from faith, and failure makes you blame someone and push harder.