Aside from the four basic conditional forms, Emacs Lisp also
has a pattern-matching conditional form, the
a hybrid of
(see Conditionals in Common Lisp Extensions)
that overcomes their limitations and introduces
the pattern matching programming style.
The limitations that
pcase overcomes are:
condform chooses among alternatives by evaluating the predicate condition of each of its clauses (see Conditionals). The primary limitation is that variables let-bound in condition are not available to the clause’s body-forms.
Another annoyance (more an inconvenience than a limitation)
is that when a series of condition predicates implement
equality tests, there is a lot of repeated code. (
solves this inconvenience.)
cl-casemacro chooses among alternatives by evaluating the equality of its first argument against a set of specific values.
Its limitations are two-fold:
cl-case unsuitable for strings or compound
data structures (e.g., lists or vectors). (
cond doesn’t have
these limitations, but it has others, see above.)
pcase macro borrows the first-arg focus
cl-case and the clause-processing flow of
replacing condition with a generalization of
the equality test which is a variant of pattern matching,
and adding facilities so that you can concisely express a
clause’s predicate, and arrange to share let-bindings between
a clause’s predicate and body-forms.
The concise expression of a predicate is known as a pattern.
When the predicate, called on the value of the first arg, returns
nil, we say that “the pattern matches the value” (or
sometimes “the value matches the pattern”).
|• The ||Includes examples and caveats.|
|• Extending ||Define new kinds of patterns.|
|• Backquote-Style Patterns||Structural patterns matching.|
|• Destructuring with pcase Patterns||Using pcase patterns to extract subfields.|