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