Macros
Macros provide a facility for extending the base syntax of GOO.  The
design is based on quasiquote code templates and a simple list pattern
matching facility.
| QUASIQUOTE | (QUASIQUOTE ,@qq-forms) | S | 
|  | QUOTE with selective evaluation using UNQUOTE and
  SPLICING-UNQUOTE (cf. Lisp and Scheme's QUASIQUOTE),
  abbreviated "`". |  | 
| UNQUOTE | (UNQUOTE ,form) | S | 
|  | evaluates ,form in the midst of a QUASIQUOTE
  expression, abbreviated ",". |  | 
| SPLICING-UNQUOTE | (SPLICING-UNQUOTE ,form) | S | 
|  | evaluates ,form in the midst of a QUASIQUOTE
       expression and splices it in, abbreviated ",@". |  | 
| MATCH | (MATCH ,exp (,pat ,val) ...) | S | 
|  | evaluates ,val corresponding to first ,pat
  matching ,exp.  The pattern is much the same as QUASIQUOTE 
  and can contain either UNQUOTE'd variables
  or UNQUOTE-SPLICING variables.  For example, 
(MATCH '(1 2) ((,a ,b) (lst a b))) $ --> $ (1 2) 
(MATCH '(1 2) ((,a ,@b) (lst a b))) $ --> $ (1 (2))
 |  | 
| DS | (DS ,pattern ,@body) | S | 
|  | defines a macro matching pattern ,pattern and expanding according to
  ,@body. The pattern matching occurs as in MIF and makes available
  pattern variables during the evaluation of (SEQ ,@body).  For example, 
(DS (when ,test ,@body) 
  `(if (not ,test) (seq ,@body)))
defines the when macro in GOO. |  | 
|  | 
where
| pattern | ==  (,@qq-forms) | L | 
|  | 
| CT | (CT ,@body) | S | 
|  | evaluates (SEQ ,@body) at compile-time allowing a user to make
  available computations for the purpose of macro-expansion. |  | 
| CT-ALSO | (CT-ALSO ,@body) | S | 
|  | equivalent to CT, but also includes a copy of
  ,@body in compiled
  images.  Similar to (eval-when (:compile-toplevel :execute) ...)
  in Common LISP.  The return value of CT-ALSO is undefined. |  | 
| MACRO-EXPAND | (MACRO-EXPAND ,form) | S | 
|  | recursively expands macros in expression ,form. |  | 
|  |