Next: Blocks and Exits, Previous: Variable Bindings, Up: Control Structure [Contents][Index]

### 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`.

Next: Blocks and Exits, Previous: Variable Bindings, Up: Control Structure [Contents][Index]