Next: , Previous: , Up: Pattern-Matching Conditional   [Contents][Index]


11.4.2 pcaseの拡張

pcaseマクロは数種類のパターンをサポートします(Pattern-Matching Conditionalを参照)。pcase-defmacroを使用すれば違う種類のパターンにたいするサポートを追加できます。

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

(name actual-args)のように呼び出すために新たな種類のpcase用のパターンを定義する。pcaseマクロはbodyを評価する呼び出しへと展開する。このマクロの役割はargsactual-argsにバインドした環境下において、呼び出されたパターンを別の何らかのパターンに書き換えることである。

さらにpcaseのドキュメント文字列とともにdocが表示されるように計らう。docでは慣例によりexpressionの評価結果を示すためにEXPVALを使用すること。

bodyは通常はより基本的なパターンを使用して呼び出されたパターンを書き換える。最終的にはすべてのパターンはコアパターンに絞り込まれるが、bodyがすぐにコアパターンを使用する必要はない。以下の例ではless-thaninteger-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-thanbody )ではpredというコアパターンだけが使用されていて、2つ目では2つのコアパターンandpredと新たに定義したパターンless-thanが使用されています。そしていずれの書き換えにおいてもシングルバッククォート構文が使用されています(Backquoteを参照)。