pcase ¶pcase 宏支持多种模式(see 模式匹配条件)。你可以通过 pcase-defmacro 宏为其添加对其他模式类型的支持。
为 pcase 定义一种新的模式类型,该模式可通过 (name actual-args) 的形式调用。
pcase 宏会将该调用展开为一个函数调用,并在这个函数调用中执行 body 的求值逻辑;而 body 的核心作用是:在 args 绑定到 actual-args 的环境中,将被调用的这个新模式重写为其他已有的模式。
此外,该宏还会把 doc 文档信息整合到pcase 的文档字符串中一并展示。按照惯例,doc 中应使用 EXPVAL来指代对 expression(pcase 的第一个参数)求值后的结果。
通常情况下,body 会将被调用的模式重写为更基础的模式。尽管所有模式最终都会被归约为核心模式,但 body 不必直接使用核心模式。
下面的示例定义了两个模式,分别名为 less-than 和 integer-less-than。
(pcase-defmacro less-than (n) "Matches if EXPVAL is a number less than N." `(pred (> ,n)))
(pcase-defmacro integer-less-than (n)
"Matches if EXPVAL is an integer less than N."
`(and (pred integerp)
(less-than ,n)))
注意,这些文档字符串以常规方式提及了 args(在本例中只有一个:n),并且按照惯例也提及了 EXPVAL。
第一次重写(即 less-than 对应的 body)使用了一种核心模式:pred。
第二次重写使用了两种核心模式:and 和 pred,以及刚刚定义的新模式 less-than。
两者都使用了单个反引号结构(see 反引号)。