Function COMPUTE-RESTARTS
compute-restarts &optional condition => restarts
condition - コンディションオブジェクトか、nil
restarts - restartのリスト
compute-restartsはそのプログラムの動的状態から 現在有効のrestartのリストを計算するときに使われます。
結果のリストには順番があり、 もっとも内側(より最近確立されたもの)のrestartが リストの先頭に近いものになります。
もしconditionがnilではないときは、 それらのrestartは、明にconditionと関連付けられているものか、 あるいはどのコンディションにも関連付けられてないものかの どちらかのみが集められます。 これは、排他されたrestartというのは、 関連付けられたコンディションの集合が空ではなく、 その要素に指定したconditionが含まれていないということです。 もしconditionがnilのときは、 全てのrestartが集められます。
compute-restartsは全ての適用可能なrestartが返却され、 それには匿名のものや、 あるものが他のものと同じ名前のものも含まれるため、 したがってfind-restartの引数にシンボルを指定したものでは 見つけることができないものも含まれます。
実装は、同じ動的環境下でcompute-restartsを繰り返し呼び出したときに、 違うリストを返却することが許されますが、必須ではありません。 compute-restartsによって返却されたリストを 全て変更したときの結果は未定義です。
Examples:
;; ユーザーへrestartを表示させるような
;; 対話式デバッガーのひとつの方法
(defun invoke-a-restart ()
(let ((restarts (compute-restarts)))
(do ((i 0 (+ i 1)) (r restarts (cdr r))) ((null r))
(format t "~&~D: ~A~%" i (car r)))
(let ((n nil) (k (length restarts)))
(loop (when (and (typep n 'integer) (>= n 0) (< n k))
(return t))
(format t "~&Option: ")
(setq n (read))
(fresh-line))
(invoke-restart-interactively (nth n restarts)))))
(restart-case (invoke-a-restart)
(one () 1)
(two () 2)
(nil () :report "Who knows?" 'anonymous)
(one () 'I)
(two () 'II))
>> 0: ONE
>> 1: TWO
>> 2: Who knows?
>> 3: ONE
>> 4: TWO
>> 5: Return to Lisp Toplevel.
>> Option: 4
=> II
;; ユーザー定義のrestartを追加した地点では、COMPUTE-RESTARTは
;; システムが用意したrestartの情報も返却してしまうことに注意してください。
;; 例えば上記の"Return to Lisp Toplevel"がそうです。なし。
存在するrestart
なし。
find-restart, invoke-restart, restart-bind
なし。