| |
| |
| |
| |
| |
|
|
| (cl:in-package #:hooks) |
|
|
| (defun read-value () |
| "Read a replacement value." |
| (format *query-io* "Replacement value: ") |
| (force-output *query-io*) |
| (list (read *query-io*))) |
|
|
| (declaim (inline run-handler-without-restarts)) |
|
|
| (defun run-handler-without-restarts (handler &rest args) |
| (declare (optimize (speed 3) (safety 0) (debug 0))) |
| "Run HANDLER with ARGS." |
| (apply (the function handler) args)) |
|
|
| (defun signal-with-hook-and-handler-restarts |
| (hook handler condition |
| retry-hook use-value-for-hook |
| retry-handler skip-handler use-value-for-handler) |
| "Signal CONDITION with appropriate restarts installed. |
| |
| The installed restarts for HANDLER are: |
| + `retry' |
| + `continue' |
| + `use-value' |
| |
| The installed restarts for HOOK are: |
| + `retry' |
| + `use-value'" |
| (restart-case |
| (progn |
| (error condition)) |
|
|
| |
| (retry () |
| :report (lambda (stream) |
| (format stream "~@<Retry running handler ~S.~:@>" |
| handler)) |
| (funcall retry-handler)) |
|
|
| |
| (continue (&optional condition) |
| :report (lambda (stream) |
| (format stream "~@<Skip handler ~S.~:@>" handler)) |
| (declare (ignore condition)) |
| (funcall skip-handler)) |
|
|
| |
| (use-value (value) |
| :report (lambda (stream) |
| (format stream "~@<Specify a value to be used instead ~ |
| of the result of running handler ~ |
| ~S.~:@>" |
| handler)) |
| :interactive read-value |
| (funcall use-value-for-handler value)) |
|
|
| |
| (retry () |
| :report (lambda (stream) |
| (format stream "~@<Retry running hook ~S.~@:>" |
| hook)) |
| (funcall retry-hook)) |
|
|
| |
| (use-value (value) |
| :report (lambda (stream) |
| (format stream "~@<Specify a value instead of ~ |
| running hook ~S.~@:>" |
| hook)) |
| :interactive read-value |
| (funcall use-value-for-hook value)))) |
|
|