11.4.2 扩展 pcase

pcase 宏支持多种模式(see 模式匹配条件)。你可以通过 pcase-defmacro 宏为其添加对其他模式类型的支持。

Macro: pcase-defmacro name args [doc] &rest body

pcase 定义一种新的模式类型,该模式可通过 (name actual-args) 的形式调用。 pcase 宏会将该调用展开为一个函数调用,并在这个函数调用中执行 body 的求值逻辑;而 body 的核心作用是:在 args 绑定到 actual-args 的环境中,将被调用的这个新模式重写为其他已有的模式。

此外,该宏还会把 doc 文档信息整合到pcase 的文档字符串中一并展示。按照惯例,doc 中应使用 EXPVAL来指代对 expressionpcase 的第一个参数)求值后的结果。

通常情况下,body 会将被调用的模式重写为更基础的模式。尽管所有模式最终都会被归约为核心模式,但 body 不必直接使用核心模式。 下面的示例定义了两个模式,分别名为 less-thaninteger-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。 第二次重写使用了两种核心模式:andpred,以及刚刚定义的新模式 less-than。 两者都使用了单个反引号结构(see 反引号)。


emacs

Emacs

org-mode

Orgmode

Donations

打赏

Copyright

© 2025 Jasper Hsu

Creative Commons

Creative Commons

Attribute

Attribute

Noncommercial

Noncommercial

Share Alike

Share Alike