Macro RESTART-BIND

UP


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は、 与えられたnamerestartの効果がある 動的環境下でformを実行します。

もしnamenilなら、 それは匿名のrestartを意味しており、 namenilでないシンボルのときは、 名前付き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*nilrestartが印刷されるときはいつでも呼ばれます。

対話式の介入があるときは、 その結果は下記で説明するような :interactive-functionの値に依存します。

副作用

なし。

影響

*query-io*

例外

なし。

参考

restart-case, with-simple-restart

備考

restart-bindは、 主にrestart-caseを実装するときに 使用されることを意図しており、 他のマクロを実装するときにも有用である可能性があります。 restart-caserestart-bindのどちらを使うか 迷っているプログラマーは、 restart-caseがこのような場合には十分に強力で好まれますし、 完全な一般性が本当に必要な場合のみ restart-bindを使うことをお勧めします。


TOP, Github