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

19.2.15.2 仕様一覧

マクロ呼び出しの一部の引数が評価され、他の引数が評価されない場合、Edebug仕様には仕様リストが必要です。仕様リスト内の要素の中には、1つ以上の引数に一致するものもあれば、それ以降のすべての要素の処理を変更するものもあります。後者は仕様キーワードと呼ばれ、‘&’(&optionalなど)で始まる記号です。

仕様リストには、それ自体がリストである引数に対応するサブリストや、グループ化に用いられるベクトルが含まれる場合があります。このように、サブリストやグループによって、仕様リストは階層的なレベルに細分化されます。仕様キーワードは、それが含まれているサブリストまたはグループの残りの部分にのみ適用されます。

仕様リストに代替や繰り返しが含まれる場合、実際のマクロ呼び出しと照合する際にバックトラッキングが必要になることがあります。詳細については、仕様におけるバックトラッキングを参照してください。

Edebugの仕様では、正規表現マッチングの機能に加え、いくつかの文脈自由文法の構成要素――バランスの取れた括弧によるサブリストのマッチング、フォームの再帰的処理、および間接仕様による再帰――が提供されています。

以下に、仕様書に記載され得る要素とその意味をまとめた表を示します(参照例については、仕様書の例を参照してください):

sexp

評価されておらず、インストルメンテーションも施されていない単一のLispオブジェクト。マクロがマクロ展開時に引数を評価する場合は、formではなくsexpを使用してください。

form

インストルメンテーションが施された、評価済みの単一の式。マクロが評価前に式を lambda でラップしている場合は、代わりに def-form を使用してください。後述の def-form を参照してください。

place

一般化変数。一般化変数を参照。

body

&rest formの略。後述の&restを参照してください。マクロが評価される前にコード本体をlambdaで囲む場合は、代わりにdef-bodyを使用してください。後述のdef-bodyを参照してください。

lambda-expr

クォートのないラムダ式。

&optional

仕様書リストに続く要素はすべて任意であり、いずれか一つでも一致しない時点で、Edebugはこのレベルでマッチングを停止します。

少数の要素を任意とし、その後に必須の要素を続ける場合は、[&optional specs…] を使用します。複数の要素がすべて一致するか、あるいはいずれも一致しないことを指定する場合は、&optional [specs…] を使用します。defun の例を参照してください。

&rest

仕様リスト内の以下の要素はすべて、0回以上繰り返されます。ただし、最後の繰り返しにおいては、仕様リストのすべての要素に一致する前に式が尽きても問題ありません。

少数の要素のみを繰り返す場合は、[&rest specs…] を使用します。繰り返しごとにすべて一致させる必要がある複数の要素を指定する場合は、&rest [specs…] を使用します。

&or

仕様リストにある以下の各要素は、代替案となります。いずれか一つの代替案が一致しなければ、&or の仕様は失敗となります。

&or に続く各リスト要素は、単一の選択肢となります。2つ以上のリスト要素を単一の選択肢としてグループ化する場合は、それらを […] で囲みます。

&not

以下の各要素は、あたかも &or を使用しているかのように代替候補として照合されますが、いずれかが一致した場合、仕様は失敗します。いずれも一致しない場合は、何も照合されませんが、&not の仕様は成功します。

&define

この仕様が定義形式であることを示します。Edebugにおける定義形式の定義とは、定義形式の実行後に保存され、後で実行される1つ以上のコード形式を含む形式のことです。

定義フォーム自体にはインストルメンテーションが行われませんが(つまり、Edebugは定義フォームの前後で停止しません)、その内部にあるフォームには通常インストルメンテーションが行われます。&define キーワードは、リスト指定における最初の要素とする必要があります。

nil

現在の引数リストレベルで一致する引数がなくなった場合に成功し、そうでない場合は失敗します。サブリストの仕様およびバッククォートの例を参照してください。

gate

どの引数もマッチしませんが、このレベルで仕様の残りの部分を照合している間は、ゲートを遡るバックトラッキングは無効になります。これは主に、より具体的な構文エラーメッセージを生成するために使用されます。詳細については、仕様におけるバックトラッキングを参照してください。また、letの例も参照してください。

&error

edebug-spec では、&error の後に文字列(エラーメッセージ)を指定します。これによりインストルメンテーションが中断され、メッセージがミニバッファに表示されます。

&interpose

残りのコードのパースを制御する関数を用意しましょう。この関数は &interpose spec fun args... という形式をとり、Edebug がまず spec をコードにマッチさせ、次に spec にマッチしたコード、パース関数 pf、そして最後に args... を引数として fun を呼び出すことを意味します。パース関数は、残りのコードのパースに使用する仕様リストを示す単一の引数を受け取ります。この関数はちょうど1回だけ呼び出され、fun が返すことが期待されるインストルメンテーション済みのコードを返します。例えば (&interpose symbolp pcase--match-pat-args) は、第1要素がシンボルである sexps にマッチし、その後 pcase--match-pat-args に pcase--match-pat-args に従ってそのヘッドシンボルに関連付けられた仕様を検索させ、それらを引数として受け取った pf に渡します。

other-symbol

仕様リスト内のその他の記号は、述語または間接仕様である場合があります。

シンボルに Edebug 仕様がある場合、この間接仕様は、シンボルの代わりに使用されるリスト仕様か、あるいは引数を処理するために呼び出される関数のいずれかである必要があります。この仕様は def-edebug-elem-spec を用いて定義できます:

関数: def-edebug-elem-spec element specification

シンボル element の代わりに使用する specification を定義してください。specification はリストである必要があります。

それ以外の場合、シンボルは述語である必要があります。その述語に引数を渡して呼び出し、述語が nil を返した場合、仕様は失敗し、引数はインストルメントされません。

適切な述語としては、symbolp、integerp、stringp、vectorp、atomなどが挙げられます。

[elements…]

要素のベクトルは、要素を単一のグループ指定にまとめます。その意味はベクトルとは無関係です。

"string"

引数は string という名前のシンボルである必要があります。この仕様は、クォートされたシンボル 'symbol(ここで symbol の名前は string となります)と同等ですが、文字列形式が推奨されます。

(vector elements…)

引数は、要素が仕様の elements と一致する必要があるベクトルである必要があります。バッククォートの例を参照してください。

(elements…)

それ以外のリストはサブリスト指定であり、引数は要素が指定に一致するリストでなければなりませんelements。

サブリスト指定はドット付きリストであってもよく、その場合、対応するリスト引数もドット付きリストとなり得ます。あるいは、ドット付きリスト指定の最後のCDRが、非ドット付きリスト引数と要素が一致する別のサブリスト指定(グループ化や間接的な指定、例えば(spec . [(more specs…)])によるもの)である場合もあります。これは、backquoteの例のような再帰的な指定において有用です。また、このような再帰を終了させるための、前述のnil指定に関する説明も参照してください。

なお、(specs . nil) と記述されたサブリスト指定は (specs) と等価であり、(specs . (sublist-elements…)) は (specs sublist-elements…) と等価であることに注意してください。

以下は、&define の後にのみ出現し得る追加仕様の一覧です。defun の例を参照してください。

&name

コードから現在の定義形式の名前を抽出します。形式は &name [prestring] spec [poststring] fun args... となり、これは Edebug が spec をコードに照合し、その後、現在の名前、args...、prestring、spec に一致したコード、および poststring を連結した文字列を fun に渡すことを意味します。fun が指定されていない場合は、引数を連結する関数(前の名前と新しい名前の間に @ を挟む)がデフォルトで使用されます。

name

引数(シンボル)は、定義形式の名称である。[&name symbolp]の略記。

定義済みのフォームに名前フィールドは必須ではなく、複数の名前フィールドを持つこともできます。

arg

引数(シンボル)は、定義形式の引数の名称です。ただし、ラムダリストのキーワード(‘&’ で始まるシンボル)は使用できません。

lambda-list

これはラムダリスト—ラムダ式の引数リスト—に一致します。

def-body

引数は、定義内のコード本体です。これは前述の body と同様ですが、定義本体には、その定義に関連付けられた情報を参照する別の Edebug 呼び出しを組み込む必要があります。定義内の最上位レベルのフォーム一覧には def-body を使用してください。

def-form

この引数は、定義における単一の最上位形式です。これは def-body と同様ですが、形式のリストではなく単一の形式にマッチさせるために使用されます。特殊なケースとして、def-form は形式の実行時にトレース情報が出力されないことも意味します。interactive の例を参照してください。