pcase ¶ の拡張pcase マクロは、数種類のパターンをサポートしています(パターンマッチング条件を参照)。pcase-defmacro マクロを使用することで、他の種類のパターンへの対応を追加できます。
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
が使用されています。どちらも単一のバッククォート構文(バッククォート を参照)を使用しています。