pcase
の拡張 ¶pcase
マクロは数種類のパターンをサポートします(パターンマッチングによる条件を参照)。pcase-defmacro
を使用すれば違う種類のパターンにたいするサポートを追加できます。
(name actual-args)
のように呼び出すために新たな種類のpcase
用のパターンを定義する。pcase
マクロはbodyを評価する呼び出しへと展開する。このマクロの役割はargsをactual-argsにバインドした環境下において、呼び出されたパターンを別の何らかのパターンに書き換えることである。
さらにpcase
のドキュメント文字列とともにdocが表示されるように計らう。docでは慣例によりexpressionの評価結果を示すためにEXPVAL
を使用すること。
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
の1つだけ)に言及するdocstringは通常の方法、EXPVAL
では慣例にもとづく方法であることに注意してください。1つ目の書き換え(
less-than
のbody
)ではpred
というコアパターンだけが使用されていて、2つ目では2つのコアパターンand
とpred
と新たに定義したパターンless-than
が使用されています。そしていずれの書き換えにおいてもシングルバッククォート構文が使用されています(バッククォートを参照)。