Variable Bindings
Control Structure
Blocks and Exits
These conditional forms augment Emacs Lisp's simple if,
and, or, and cond forms.
if where there are no ``else'' forms,
and possibly several ``then'' forms. In particular,
(when test a b c)
is entirely equivalent to
(if test (progn a b c) nil)
if where there are no ``then'' forms,
and possibly several ``else'' forms:
(unless test a b c)
is entirely equivalent to
(when (not test) a b c)
eql. If no clause
matches, the case form returns nil. The clauses are
of the form
(keylist body-forms...)
where keylist is a list of key values. If there is exactly
one value, and it is not a cons cell or the symbol nil or
t, then it can be used by itself as a keylist without
being enclosed in a list. All key values in the case form
must be distinct. The final clauses may use t in place of
a keylist to indicate a default clause that should be taken
if none of the other clauses match. (The symbol otherwise
is also recognized in place of t. To make a clause that
matches the actual symbol t, nil, or otherwise,
enclose the symbol in a list.)
For example, this expression reads a keystroke, then does one of
four things depending on whether it is an `a', a `b',
a RET or C-j, or anything else.
(case (read-char) (?a (do-a-thing)) (?b (do-b-thing)) ((?\r ?\n) (do-ret-thing)) (t (do-other-thing)))
case, except that if the key does
not match any of the clauses, an error is signaled rather than
simply returning nil.
case that checks for types
rather than values. Each clause is of the form
`(type body...)'. See Type Predicates,
for a description of type specifiers. For example,
(typecase x (integer (munch-integer x)) (float (munch-float x)) (string (munch-integer (string-to-int x))) (t (munch-anything x)))
The type specifier t matches any type of object; the word
otherwise is also allowed. To make one clause match any of
several types, use an (or ...) type specifier.
typecase, except that if the key does
not match any of the clauses, an error is signaled rather than
simply returning nil.