発生したコンディションからの回復手段(再起動)を提供する - lisp-cookbook-ja/common-lisp GitHub Wiki
発生したエラーについて単に上位側に通知するだけでなく、どのように回復できるかという手段を上位側に提供できます。
次の関数fooはerror関数でエラーを通知するだけのものです。しかし同時に再起動も提供しています。
(defun foo ()
(restart-case (error "Error!")
(use-value (value) ;与えられた値を返す再起動
:report "Use a value."
:interactive (lambda ()
(format t "New value: ")
(list (read)))
value)
(ignore () ;エラーを無視する(NILを返す)再起動
:report "Ignore."
nil)))
普通に呼び出すとエラーが通知されデバッガに落ちるなどします。
(foo)
; Evaluation aborted.
デバッガから対話的に再起動の方法を選ぶほかにプログラムからも制御できます。
(handler-bind ((error ;フォームからerror型のコンディションを受けたら
(lambda (c)
(declare (ignore c)) ;(引数にコンディションを受け取るのだけど今は無視します)
(invoke-restart 'use-value 10)))) ;use-value再起動を引数付きで呼び出します
(foo)) ;評価するフォーム
; => 10
(handler-bind ((error (lambda (c)
(declare (ignore c))
(invoke-restart 'ignore))))
(foo))
; => NIL