除了四种基本的条件形式之外,Emacs Lisp 还提供了一种模式匹配条件形式——pcase 宏。它是 cond 与 cl-case 的混合体(see Conditionals in Common Lisp Extensions),克服了二者的局限,并引入了模式匹配编程风格。
pcase 所解决的局限包括:
cond 形式通过对每个分支的 condition(条件)谓词进行求值,来在多个选项中做出选择(see 条件判断)。它的主要局限是:在 condition 中通过 let 绑定的变量,在该分支的 body-forms(主体形式)中不可用。
另一个麻烦点(与其说是局限,不如说是不便之处)是:当一系列 condition 谓词都是做相等性判断时,会出现大量重复代码。(cl-case 解决了这一不便。)
cl-case 宏通过将其第一个参数与一组特定值进行相等性比较,来在多个选项中选择。
它的局限体现在两个方面:
eql 函数。
这些特性导致 cl-case 不适用于字符串或复合数据结构(例如列表或向量)。
(cond 没有这些局限,但它存在其他局限,详见上文。)
从概念上讲,pcase 宏借鉴了 cl-case 以第一个参数为中心的特点,以及 cond 的分支处理流程;它用一种泛化的相等性判断(属于 模式匹配(patern matching) 的一种变体)替代了 condition,并增加了相应机制,让你可以简洁地表达分支的判断条件,同时在分支的判断条件与 body-forms 之间共享 let 绑定。
这种对判断条件的简洁表达形式被称为 模式(pattern)。当作用于第一个参数值的判断条件返回非 nil 时,我们称 “模式与该值匹配(the pattern matches the value)”(有时也说 “该值与模式匹配(the value matches the pattern)”)。