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-number 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.