Program Control
GOO provides a variety of program control constructs including
function calls, conditional execution, and nonlocal control flow.
| SEQ | (SEQ ,@forms) | S | 
|  | evaluates forms sequentially and returns values of evaluating last
  form (cf. Scheme's BEGIN) |  | 
|  | (SEQ) | S | 
|  | returns false |  | 
| IF | (IF ,test ,then [ ,else ]) | S | 
|  | evaluates either ,then if ,test is non-false
  otherwise evaluates ,else (cf. Scheme's IF).  The
  ,else expression defaults to false. |  | 
| AND | (AND ,form ,@forms) | S | 
|  | ==  (IF ,form (AND ,@FORMS)) |  | 
|  | (AND ,form) | S | 
|  | ==  ,form |  | 
| OR | (OR ,form ,@forms) | S | 
|  | ==  (SEQ (DEF x ,form) (IF x x (OR ,@FORMS))) |  | 
|  | (OR ,form) | S | 
|  | ==  ,form |  | 
| UNLESS | (UNLESS ,test ,@body) | S | 
|  | ==  (IF (NOT ,test) (SEQ ,@body)) |  | 
| WHEN | (WHEN ,test ,@body) | S | 
|  | ==  (IF ,test (SEQ ,@body)) |  | 
| COND | (COND (,test ,@body) ...) | S | 
|  | evaluates (SEQ ,@body) of first clause 
  whose ,test evaluates to
  non-false (cf. Dylan's CASE and Scheme's COND). |  | 
| CASE[-BY] | (CASE[-BY] ,value [ ,test ]((,@keys) ,@body) ...) | S | 
|  | evaluates ,value and then evaluates (SEQ ,@body)
  of first clause for which (,test ,value ,key) returns non-false
  (cf. Dylan's SELECT and Scheme's CASE).  N.B., each
  key is evaluated, thus symbols must be quoted.  The default
  ,test for the CASE form is ==. |  | 
| OPF | (OPF ,place ,expr) | S | 
|  | ==  (SEQ (DEF _ ,place) (SET ,place ,expr)), where
  ,place is evaluated only once.  For example, 
  (OPF x (+ _ 1))  ==  (SET x (+ x 1)). |  | 
| SWAPF | (SWAPF ,x ,y) | S | 
|  | ==  (SEQ (DEF tmp ,x) (SET ,x ,y) (SET ,y tmp)),
  where ,x and ,y are evaluated only once. |  | 
| call | (,f ,@args) | S | 
|  | evaluates ,f and then ,@args in left to right
  order and then calls ,f with the evaluated arguments. |  | 
| REP | (REP ,name ((,var ,init) ...) ,@body) | S | 
|  | defines a recursive loop (cf., Dylan's ITERATE or Scheme's (LET ,var ...)). |  | 
| ESC | (ESC ,name ,@body) | S | 
|  | evaluates (SEQ ,@body) with an exit
  function of a single parameter, x, bound to
  ,name that if called, will cause ESC to
  return the value of x
  (cf. Dylan's BLOCK/RETURN).  It is illegal 
  to call the exit function
  after the execution of the creating ESC form (i.e., no upward
  continuations). |  | 
| FIN | (FIN ,protected ,@cleanups) | S | 
|  | ensures that (SEQ ,@cleanups) is evaluated whether
  or not an ESC upwards exit is taken
  during the dynamic-extent of ,protected
  (cf. Dylan's BLOCK/CLEANUP form and CL's
  UNWIND-PROTECT).  The result of a FIN form is the
  result of evaluating its protected form. |  | 
| ASSERT | (ASSERT ,test ,message ,@args) | S | 
|  | ==  (UNLESS ,test (ERROR ,message ,@args)) |  | 
|  |