4つの基本的な条件式形式に加え、Emacs Lispにはパターンマッチング条件式形式であるpcaseマクロがあります。これはcondとcl-caseのハイブリッドであり(Common Lisp
ExtensionsのConditionalsを参照)、これらの制限を克服してパターンマッチング・プログラミングスタイルを導入するものです。pcaseが克服する制限は以下の通りです:
cond 形式では、各節の述語 condition
を評価することで選択肢を決定します(条件式
を参照)。主な制約は、condition で let 束縛された変数が、その節の body-forms では利用できない点です。
もう一つの煩わしい点(制約というよりはむしろ不便さ)は、一連のcondition述語で等価性判定を行う場合、コードの重複が多くなることです。(cl-caseはこの不便さを解消します。)
cl-case
マクロは、第1引数と一連の特定の値との等価性を判定することで、選択肢の中から一つを選び出します。
その限界は2点ある:
eql が使用されます。
これらにより、cl-case
は文字列や複合データ構造(リストやベクトルなど)には適しません。(cond
にはこうした制限はありませんが、別の制限があります。上記を参照してください。)
概念的には、pcase マクロは cl-case
の第1引数のフォーカスと cond の節処理フローを継承し、condition を パターンマッチング
の一種である等価性判定の一般化に置き換えるとともに、節の述語を簡潔に表現し、節の述語と body-forms の間で let 束縛を共有できるようにするための機能を追加しています。
述語の簡潔な表現はパターンと呼ばれます。第1引数の値に対して呼び出された述語がnon-nilを返すとき、「パターンが値にマッチする」(あるいは時に「値がパターンにマッチする」)と言います。