GNU Emacs 32.0.50 (9008bf64c3) のマニュアルを PLaMo 翻訳で機械翻訳したものです。誤訳を含むことがあります。原文: https://www.gnu.org/software/emacs/manual/html_node/elisp/Extending-pcase.html ・ emacs-doc.conao3.com

11.4.2 pcase の拡張

pcase マクロは、数種類のパターンをサポートしています(パターンマッチング条件を参照)。pcase-defmacro マクロを使用することで、他の種類のパターンへの対応を追加できます。

マクロ: pcase-defmacro name args [doc] &rest body

Define a new kind of pattern for pcase, to be invoked as (name actual-args). The pcase macro expands this into a function call that evaluates body, whose job it is to rewrite the invoked pattern into some other pattern, in an environment where args are bound to actual-args.

さらに、doc を pcase のドキュメント文字列と共に表示するように設定してください。慣例として、doc では EXPVAL を用いて expression の評価結果(pcase の第1引数)を表すものとします。

通常、body は呼び出されたパターンを、より基本的なパターンを用いて書き換えます。すべてのパターンは最終的にコアパターンに帰着しますが、body が直ちにコアパターンを使用する必要はありません。以下の例では、less-than と integer-less-than という2つのパターンを定義しています。

(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 についても言及しています。1回目の書き換え(すなわち less-than を body に書き換える処理)では、1つのコアパターン pred が使用されています。2回目では、2つのコアパターン and と pred、および新たに定義されたパターン less-than が使用されています。どちらも単一のバッククォート構文(バッククォート を参照)を使用しています。