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