cl: Conditionals
4.4 Conditionals
================
These conditional forms augment Emacs Lisp’s simple ‘if’, ‘and’, ‘or’,
and ‘cond’ forms.
-- Macro: cl-case keyform clause...
This macro evaluates KEYFORM, then compares it with the key values
listed in the various CLAUSEs. Whichever clause matches the key is
executed; comparison is done by ‘eql’. If no clause matches, the
‘cl-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 ‘cl-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.
(cl-case (read-char)
(?a (do-a-thing))
(?b (do-b-thing))
((?\r ?\n) (do-ret-thing))
(t (do-other-thing)))
-- Macro: cl-ecase keyform clause...
This macro is just like ‘cl-case’, except that if the key does not
match any of the clauses, an error is signaled rather than simply
returning ‘nil’.
-- Macro: cl-typecase keyform clause...
This macro is a version of ‘cl-case’ that checks for types rather
than values. Each CLAUSE is of the form ‘(TYPE BODY...)’.
Type Predicates, for a description of type specifiers. For
example,
(cl-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.
-- Macro: cl-etypecase keyform clause...
This macro is just like ‘cl-typecase’, except that if the key does
not match any of the clauses, an error is signaled rather than
simply returning ‘nil’.