Next: , Previous: Variable Bindings, Up: Control Structure

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...)’. See 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.