Next: Combining Conditions Prev: Sequencing Up: Control Structures
Conditional control structures choose among alternatives. Emacs Lisp
has two conditional forms: `if', which is much the same as in other
languages, and `cond', which is a generalized case statement.
- Special Form: if CONDITION THEN-FORM ELSE-FORMS...
`if' chooses between the THEN-FORM and the ELSE-FORMS based on the
value of CONDITION. If the evaluated CONDITION is non-`nil',
THEN-FORM is evaluated and the result returned. Otherwise, the
ELSE-FORMS are evaluated in textual order, and the value of the
last one is returned. (The ELSE part of `if' is an example of an
implicit `progn'. Note: Sequencing.)
If CONDITION has the value `nil', and no ELSE-FORMS are given,
`if' returns `nil'.
`if' is a special form because the branch which is not selected is
never evaluated--it is ignored. Thus, in the example below,
`true' is not printed because `print' is never called.
- Special Form: cond CLAUSE...
`cond' chooses among an arbitrary number of alternatives. Each
CLAUSE in the `cond' must be a list. The CAR of this list is the
CONDITION; the remaining elements, if any, the BODY-FORMS. Thus,
a clause looks like this:
`cond' tries the clauses in textual order, by evaluating the
CONDITION of each clause. If the value of CONDITION is non-`nil',
the BODY-FORMS are evaluated, and the value of the last of
BODY-FORMS becomes the value of the `cond'. The remaining clauses
If the value of CONDITION is `nil', the clause "fails", so the
`cond' moves on to the following clause, trying its CONDITION.
If every CONDITION evaluates to `nil', so that every clause fails,
`cond' returns `nil'.
A clause may also look like this:
Then, if CONDITION is non-`nil' when tested, the value of
CONDITION becomes the value of the `cond' form.
The following example has four clauses, which test for the cases
where the value of `x' is a number, string, buffer and symbol,
(cond ((numberp x) x)
((stringp x) x)
(setq temporary-hack x) ; multiple body-forms
(buffer-name x)) ; in one clause
((symbolp x) (symbol-value x)))
Often we want the last clause to be executed whenever none of the
previous clauses was successful. To do this, we use `t' as the
CONDITION of the last clause, like this: `(t BODY-FORMS)'. The
form `t' evaluates to `t', which is never `nil', so this clause
never fails, provided the `cond' gets to it at all.
(cond ((eq a 1) 'foo)
This expression is a `cond' which returns `foo' if the value of
`a' is 1, and returns the string `"default"' otherwise.
Both `cond' and `if' can usually be written in terms of the other.
Therefore, the choice between them is a matter of taste and style. For
(if A B C)
(cond (A B) (t C))
automatically generated by info2www