Macro RESTART-BIND
restart-bind ({(name function {key-val-pair}*)}) form*
=> result*
key-val-pair::= :interactive-function interactive-function |
:report-function report-function |
:test-function test-function
name - シンボル。評価されません。
function - フォーム。評価されます。
form - 暗黙のprogn
interactive-function - フォーム。評価されます。
report-function - フォーム。評価されます。
test-function - フォーム。評価されます。
result - formによる返却値
restart-bindは、 与えられたnameのrestartの効果がある 動的環境下でformを実行します。
もしnameがnilなら、 それは匿名のrestartを意味しており、 nameがnilでないシンボルのときは、 名前付きrestartを意味しています。
function, interactive-function, report-functionは、 現在のレキシカルな環境と ボディ部を評価する前の動的環境下で 無条件に評価されます。 これらの各フォームは、関数に評価しなければなりません。
もしinvoke-restartがそのrestartを実行したとき、 functionを評価された結果の関数を、 invoke-restartの動的環境下で invoke-restartに与えた引数ともに呼び出します。 その関数は、非局所的な遷移の制御が行われるか、 あるいは通常の返却をするかのどちらかになります。
もしrestartがデバッガーから (invoke-restart-interactivelyを使って) 対話的に起動されたとき、 その引数は、interactive-functionを評価した結果の引数を 呼び出すことによって指定します。 restartが起動されたとき、その関数はオプションで 対話的にquery-ioからプロンプトで問い合わせを行い、 invoke-restart-interactivelyによって使われる 引数のリストを返却しなければなりません。
もしrestartが対話的に実行されたものの、 interactive-functionがなかったときは、 引数のリストはnilが使用されます。 このよう場合、関数は空の引数リストと互換がなければなりません。
もしrestartの表示が対話中に行われたとき(例えばデバッガーによって)、 その表示はreport-functionが評価された結果の関数を 呼び出すことによって行われます。 その関数はひとつの引数にストリームを取る関数でなければなりません。 それはストリームを受け取ったrestartが行うことの 説明の印刷を期待しています。 この関数は、*print-escape*がnilで restartが印刷されるときはいつでも呼ばれます。
対話式の介入があるときは、 その結果は下記で説明するような :interactive-functionの値に依存します。
:interactive-function
restartが実行されたとき、 invoke-restart-interactivelyによって使われる 引数のリストの構築を行います。 :report-function
restartが取る行動の 要約を印刷します。 :test-function
restartが見えていると 考えられるときはtrueを返却します。 なし。
なし。
restart-case, with-simple-restart
restart-bindは、 主にrestart-caseを実装するときに 使用されることを意図しており、 他のマクロを実装するときにも有用である可能性があります。 restart-caseとrestart-bindのどちらを使うか 迷っているプログラマーは、 restart-caseがこのような場合には十分に強力で好まれますし、 完全な一般性が本当に必要な場合のみ restart-bindを使うことをお勧めします。