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
を使うことをお勧めします。