Establishing Restart Code - MIT/GNU Scheme 7.7.90+
Description: MIT/GNU Scheme 7.7.90+

Next: Invoking Standard Restart Code, Previous: Restarts, Up: Restarts

#### 16.4.1 Establishing Restart Code

— procedure: with-simple-restart name reporter thunk

> 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.

— procedure: with-restart name reporter effector interactor thunk

> 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)