Next: Invoking Standard Restart Code, Previous: Restarts, Up: Restarts [Contents][Index]
Invokes thunk in a dynamic environment created by adding a restart named name to the existing named restarts. Reporter may be used during the execution of thunk to produce a description of the newly created restart; it must either be a procedure of one argument (a port) or a string. By convention, the description generated by reporter should be a short complete sentence, with first word capitalized and terminated by a period. The sentence should fit on one line with a little room to spare (see the examples below); usually this means that the sentence should be 70 characters or less in length.
If the restart created by with-simple-restart
is invoked it
simply aborts the computation in progress by returning an unspecified
value from the call to with-simple-restart
. Otherwise
with-simple-restart
returns the value computed by thunk.
(with-simple-restart 'george "This restart is named george."
(lambda () 3)) ⇒ 3
(with-simple-restart 'george "This restart is named george."
(lambda ()
(invoke-restart (find-restart 'george)))) ⇒ unspecific
(with-simple-restart 'george "This restart is named george."
(lambda () (car 3)))
;The object 3, passed as the first argument to car,
; is not the correct type.
;To continue, call RESTART with an option number:
; (RESTART 3) => Specify an argument to use in its place.
; (RESTART 2) => This restart is named george.
; (RESTART 1) => Return to read-eval-print level 1.
Invokes thunk in a dynamic environment created by adding a restart
named name to the existing named restarts. Reporter may be
used during the execution of thunk to produce a description of the
newly created restart; it must either be a procedure of one argument (a
port) or a string. Effector is a procedure which will be called
when the restart is invoked by invoke-restart
. Interactor
specifies the arguments that are to be passed to effector when it
is invoked interactively; it may be either a procedure of no arguments,
or #f
. If interactor is #f
, this restart is not
meant to be invoked interactively.
The value returned by with-restart
is the value returned by
thunk. Should the restart be invoked by a condition handler,
however, the effector will not return back to the handler that
invoked it. Instead, the effector should call a continuation
created before the condition-signalling process began, and
with-restart
will therefore not return in the normal manner.
(define (by-george! thunk) ; This code handles conditions that arise while executing thunk ; by invoking the GEORGE restart, passing 1 and 2 to the restart’s ; effector code. (bind-condition-handler '() ; All conditions (lambda (condition) (invoke-restart (find-restart 'george) 1 2)) thunk))
(define (can-george! thunk) ; This code provides a way of handling errors: the GEORGE restart. ; In order to GEORGE you must supply two values. (lambda () (call-with-current-continuation (lambda (kappa) (with-restart 'george ; Name "This restart is named george." ; Reporter (lambda (a b) ; Effector (kappa (list 'george a b))) values ; Interactor thunk))))) ; Thunk
(by-george! (can-george! (lambda () -3)) ⇒ -3 (by-george! (can-george! (lambda () (car 'x)))) ⇒ (george 1 2)
Next: Invoking Standard Restart Code, Previous: Restarts, Up: Restarts [Contents][Index]