(FILECREATED "15-Jul-86 16:02:24" {ERIS}<LISPCORE>LIBRARY>CL-ERROR.;40 60392
changes to: (FUNCTIONS DEFINE-CONDITION CCASE CONDITION-CASE PROCEED-CASE
DEFINE-PROCEED-FUNCTION FIND-PROCEED-CASE DEFAULT-HANDLE-CONDITION
ERR::WITH-LOOP-VARS CHECK-TYPE ETYPECASE CTYPECASE ECASE CL:ASSERT)
(VARS CL-ERRORCOMS)
previous date: " 4-Jul-86 01:34:27" {ERIS}<LISPCORE>LIBRARY>CL-ERROR.;35)
(* Copyright (c) 1986 by Xerox Corporation. All rights reserved.)
(PRETTYCOMPRINT CL-ERRORCOMS)
(RPAQQ CL-ERRORCOMS
((COMS (* *
"Temporary bootstrapping stuff. Anything in here gets changed once CL starts working."
)
(FUNCTIONS CONDITION-TYPEP CONDITION-TYPE-OF CONDITION-SUBTYPEP CONDITION-TYPECASE
CONDITION-BLOCK CONDITION-RETURN)
(FUNCTIONS FAKE-TYPEP-FOR-CONDITIONS FAKE-TYPE-OF-FOR-CONDITIONS
FAKE-SUBTYPEP-FOR-CONDITIONS))
(COMS (* * "Internal stuff.")
(VARIABLES %%CONDITION-TYPES-REAL)
(VARIABLES *CONDITION-HANDLER-BINDINGS* *PROCEED-CASES* *DEBUGGED-CONDITION*)
(VARIABLES *DEBUG-IO* *ERROR-OUTPUT*)
(FUNCTIONS CONDITION-REPORTER CONDITION-HANDLER DEFAULT-PROCEED-REPORT
DEFAULT-PROCEED-TEST)
(FUNCTIONS CHECK-TYPE-FAIL ECASE-FAIL ASSERT-FAIL STRIP-KEYWORDS MAKE-REPORT-FUNCTION
NORMALIZE-SLOT-DESCRIPTIONS EXTRACT-CONDITION-BINDINGS
NORMALIZE-CONDITION-CLAUSES MASSAGE-CATCH-CONDITION-CLAUSES
SPLIT-PROCEED-CLAUSES PROCESS-PROCEED-KEYWORDS DEFAULT-PROCEED-REPORTER
CHECK-*CASE-SELECTOR COLLECT-CASE-SELECTORS FIX-INHERITANCE-LINKS
MAKE-INTO-CONDITION RAISE-SIGNAL NO-PROCEED-TEST TEST-PROCEED-CASE
DEFAULT-HANDLE-CONDITION ERR::WITH-LOOP-VARS))
(COMS (* * "User-visible forms.")
(VARIABLES *BREAK-ON-WARNINGS*)
(FUNCTIONS DEFINE-CONDITION CHECK-TYPE ETYPECASE CTYPECASE ECASE CCASE CL:ASSERT
CONDITION-BIND CONDITION-CASE IGNORE-ERRORS PROCEED-CASE DEFINE-PROCEED-FUNCTION
CATCH-ABORT SIGNAL CERROR DEBUG CL:BREAK COMPUTE-PROCEED-CASES FIND-PROCEED-CASE
INVOKE-PROCEED-CASE REPORT-CONDITION)
(PROP PROPTYPE %%CONDITION-HANDLER %%CONDITION-REPORTER)
(FUNCTIONS ABORT PROCEED))
(COMS (FNS MAKE-CONDITION)
(STRUCTURES CONDITION SIMPLE-CONDITION WARNING SIMPLE-WARNING SERIOUS-CONDITION
SIMPLE-BREAK CL:ERROR SIMPLE-ERROR ASSERTION-FAILED CELL-ERROR UNBOUND-VARIABLE
UNDEFINED-FUNCTION NO-PROCEED-TEST INDEX-BOUNDS-ERROR)
(STRUCTURES CALL-ERROR PROCEED-CASE TOO-MANY-ARGUMENTS)
(COMS (FUNCTIONS PRETTY-TYPE-NAME REPORT-TYPE-MISMATCH)
(STRUCTURES TYPE-MISMATCH))
(STRUCTURES CONTROL-ERROR BAD-PROCEED-CASE ILLEGAL-GO ILLEGAL-RETURN ILLEGAL-THROW)
(STRUCTURES STREAM-ERROR READ-ERROR END-OF-FILE)
(STRUCTURES STORAGE-CONDITION STACK-OVERFLOW STORAGE-EXHAUSTED)
(FUNCTIONS USE-VALUE))
(COMS (* * "Environment stuff.")
(FUNCTIONS PROCEED-FROM-BREAK PROCEED-WITH-DEFAULTS CREATE-PROCEED-KEYLIST
PROCEED-USING-MENU CREATE-PROCEED-MENU)
(ADDVARS (BREAKMACROS (PR (PROCEED-FROM-BREAK)))))
(FUNCTIONS WARN CL:ERROR)
(PROP FILETYPE CL-ERROR)
(DECLARE: DONTEVAL@LOAD DOEVAL@COMPILE DONTCOPY COMPILERVARS (ADDVARS (NLAMA)
(NLAML)
(LAMA MAKE-CONDITION)))))
(* * "Temporary bootstrapping stuff. Anything in here gets changed once CL starts working.")
(DEFMACRO CONDITION-TYPEP (DATUM TYPE) (BQUOTE (FAKE-TYPEP-FOR-CONDITIONS (\, DATUM)
(\, TYPE))))
(DEFMACRO CONDITION-TYPE-OF (DATUM) (BQUOTE (FAKE-TYPE-OF-FOR-CONDITIONS (\, DATUM))))
(DEFMACRO CONDITION-SUBTYPEP (T1 T2) (BQUOTE (FAKE-SUBTYPEP-FOR-CONDITIONS (\, T1)
(\, T2))))
(DEFMACRO CONDITION-TYPECASE (OBJECT &REST CLAUSES)
(LET ((VAL (GENTEMP)))
(BQUOTE
(LET (((\, VAL)
(\, OBJECT)))
(COND
(\,@ (CL:MAPCAR (CL:FUNCTION
(CL:LAMBDA (CLAUSE)
(DESTRUCTURING-BIND
(SELECTOR . BODY)
CLAUSE
(CL:IF (EQ SELECTOR T)
CLAUSE
(BQUOTE ((CONDITION-TYPEP (\, VAL)
(QUOTE (\, SELECTOR)))
(\,@ BODY)))))))
CLAUSES)))))))
(DEFMACRO CONDITION-BLOCK (TAG &BODY FORMS) (BQUOTE (CATCH (QUOTE (\, TAG))
(\,@ FORMS))))
(DEFMACRO CONDITION-RETURN (TAG &OPTIONAL RESULT) (BQUOTE (THROW (QUOTE (\, TAG))
(\, RESULT))))
(DEFUN FAKE-TYPEP-FOR-CONDITIONS (DATUM TYPE) (* amd " 9-Apr-86 17:41")
(AND (CONSP DATUM)
(CONDITION-SUBTYPEP (CAR DATUM)
TYPE)))
(DEFUN FAKE-TYPE-OF-FOR-CONDITIONS (DATUM) (CAR DATUM))
(DEFUN FAKE-SUBTYPEP-FOR-CONDITIONS (T1 T2) (* amd " 9-Apr-86 18:04")
(VALUES (AND (for old T1 by (GET T1 (QUOTE %%CONDITION-PARENT)) while T1
thereis (EQ T1 T2))
T)
T))
(* * "Internal stuff.")
(DEFPARAMETER %%CONDITION-TYPES-REAL NIL)
(DEFVAR *CONDITION-HANDLER-BINDINGS* NIL "Condition handler binding stack")
(DEFVAR *PROCEED-CASES* NIL "Active proceed case stack")
(DEFVAR *DEBUGGED-CONDITION* NIL "The condition passed to the latest instance of DEBUG")
(DEFVAR *DEBUG-IO* T)
(DEFVAR *ERROR-OUTPUT* T)
(DEFMACRO CONDITION-REPORTER (CONDITION-TYPE) (BQUOTE (GET (\, CONDITION-TYPE)
(QUOTE %%CONDITION-REPORTER))))
(DEFMACRO CONDITION-HANDLER (CONDITION-TYPE) (BQUOTE (GET (\, CONDITION-TYPE)
(QUOTE %%CONDITION-HANDLER))))
(DEFMACRO DEFAULT-PROCEED-REPORT (PROCEED-TYPE) (BQUOTE (GET (\, PROCEED-TYPE)
(QUOTE %%DEFAULT-PROCEED-REPORT)
(CL:FUNCTION DEFAULT-PROCEED-REPORTER))))
(DEFMACRO DEFAULT-PROCEED-TEST (PROCEED-TYPE) (BQUOTE (GET (\, PROCEED-TYPE)
(QUOTE %%DEFAULT-PROCEED-TEST))))
(DEFUN CHECK-TYPE-FAIL (PROCEEDABLE PLACE VALUE DESIRED-TYPE MESSAGE)
(PROCEED-CASE (CL:ERROR (QUOTE TYPE-MISMATCH)
:NAME PLACE :VALUE VALUE :DESIRED-TYPE DESIRED-TYPE :MESSAGE MESSAGE)
(USE-VALUE (IGNORE NEW)
:REPORT
(FORMAT T "Change the value of ~A" PLACE)
:TEST
(CL:LAMBDA (CONDITION)
(AND PROCEEDABLE (CONDITION-TYPEP CONDITION (QUOTE TYPE-MISMATCH))))
NEW)))
(DEFUN ECASE-FAIL (PROCEEDABLE PLACE VALUE SELECTORS) (PROCEED-CASE (CL:ERROR
"The value of ~S, ~S,~&is ~?."
PLACE VALUE
"~#[wrong~;not ~S~;neither ~S nor ~S~:;not~@{~#[~; or~] ~S~↑,~}~]"
SELECTORS)
(USE-VALUE (IGNORE V)
:TEST
(CL:LAMBDA (CONDITION)
(CL:DECLARE (IGNORE
CONDITION
))
PROCEEDABLE)
:REPORT
(FORMAT T
"Change the value of ~A"
PLACE)
V)))
(DEFUN ASSERT-FAIL (STRING &REST ARGS) (PROCEED-CASE (CL:ERROR (QUOTE ASSERTION-FAILED)
:FORMAT-STRING STRING :FORMAT-ARGUMENTS
ARGS)
(PROCEED NIL :REPORT "Re-test assertion")))
(DEFUN STRIP-KEYWORDS (ARGS) (* amd "27-Mar-86 17:06")
(LET ((KEYWORDS NIL))
(while (KEYWORDP (CAR ARGS)) do (CL:PUSH (LIST (CAR ARGS)
(CADR ARGS))
KEYWORDS)
(SETF ARGS (CDDR ARGS)))
(VALUES KEYWORDS ARGS)))
(DEFUN MAKE-REPORT-FUNCTION (DATUM BOUND-VAR) (* amd " 1-Apr-86 17:44")
(TYPECASE DATUM (STRING (BQUOTE (CL:LAMBDA (DATUM STREAM)
(DECLARE (IGNORE DATUM))
(FORMAT STREAM (\, DATUM)))))
(T (BQUOTE (CL:LAMBDA ((\, BOUND-VAR)
*STANDARD-OUTPUT*)
(\, DATUM))))))
(DEFUN NORMALIZE-SLOT-DESCRIPTIONS (SLOTS) (* amd "27-Mar-86 17:41")
(CL:MAPCAR (FUNCTION (CL:LAMBDA (SLOT)
(if (LISTP SLOT)
then (if (EQUAL (LENGTH SLOT)
1)
then (APPEND SLOT (QUOTE (NIL :READONLY T)))
else (BQUOTE ((\, (CAR SLOT))
(\, (CADR SLOT))
:READ-ONLY T (\,@ (CDDR SLOT)))))
else (BQUOTE ((\, SLOT)
NIL :READ-ONLY T)))))
SLOTS))
(DEFUN EXTRACT-CONDITION-BINDINGS (CLAUSES) (CL:MAPCAR
(FUNCTION (CL:LAMBDA
(CLAUSE)
(BQUOTE (CONS (QUOTE (\, (CL:FIRST CLAUSE)))
(\, (SECOND CLAUSE))))))
CLAUSES))
(DEFUN NORMALIZE-CONDITION-CLAUSES (CLAUSES)
(MAPCAN (FUNCTION (CL:LAMBDA
(CLAUSE)
(LET ((CONDITIONS (CL:FIRST CLAUSE)))
(TYPECASE CONDITIONS
(LIST (CL:IF (EQ (CL:FIRST CONDITIONS)
(QUOTE QUOTE))
(CL:ERROR "Bad condition spec ~s. Should be unquoted."
CONDITIONS)
(CL:MAPCAR (FUNCTION (CL:LAMBDA
(C)
(CL:IF (SYMBOLP C)
(CONS C (CDR CLAUSE))
(CL:ERROR
"Bad condition spec ~s. Should be list of unquoted symbols."
CONDITIONS))))
CONDITIONS)))
(SYMBOL (LIST CLAUSE))
(T (CL:ERROR
"Bad condition spec ~s. Should be symbol or list of symbols."
CONDITIONS))))))
CLAUSES))
(DEFUN MASSAGE-CATCH-CONDITION-CLAUSES (CLAUSES INIT-VALUE)
(CL:MAPCAR (FUNCTION (CL:LAMBDA (CLAUSE)
(LET ((SELECTOR (CL:FIRST CLAUSE))
(BVL (SECOND CLAUSE))
(FORMS (NTHCDR 2 CLAUSE)))
(CL:IF (NULL BVL)
(CONS SELECTOR FORMS)
(LIST SELECTOR (BQUOTE (LET ((\, (LIST (CAR BVL)
INIT-VALUE))
(\,@ (CDR BVL)))
(\,@ FORMS))))))))
CLAUSES))
(DEFUN SPLIT-PROCEED-CLAUSES (CLAUSES TAG) (* amd "21-Apr-86 16:02")
(LET
(CASES BODIES)
(for CLAUSE in CLAUSES as SELECTOR from 0
do (DESTRUCTURING-BIND
(NAME VARS)
CLAUSE
(MULTIPLE-VALUE-BIND
(TEST REPORT TAIL)
(PROCESS-PROCEED-KEYWORDS NAME (CDDR CLAUSE))
(if (NULL NAME)
then (CL:UNLESS TEST (SETF TEST (QUOTE TRUE)))
(CL:UNLESS REPORT (CL:ERROR
"Unnamed proceed cases must have a report method: ~S"
CLAUSE))
else (* (CL:UNLESS TEST (if
(NOT (GET NAME (QUOTE
%%DEFAULT-PROCEED-REPORT))) then
(WARN
"No test specified for proceed type ~A: may be undefined."
NAME))))
(CL:UNLESS REPORT (SETF REPORT (BQUOTE (CL:LAMBDA
(PC STREAM)
(FUNCALL (DEFAULT-PROCEED-REPORT
(QUOTE (\, NAME)))
PC STREAM))))))
(CL:PUSH (BQUOTE (MAKE-PROCEED-CASE :NAME (QUOTE (\, NAME))
:TAG
(\, TAG)
:SELECTOR
(\, SELECTOR)
:TEST
(FUNCTION (\, TEST))
:REPORT
(FUNCTION (\, REPORT))))
CASES)
(CL:PUSH (BQUOTE ((\, SELECTOR)
(FUNCTION (CL:LAMBDA (\, VARS)
(\,@ TAIL)))))
BODIES))))
(VALUES (REVERSE CASES)
(REVERSE BODIES))))
(DEFUN PROCESS-PROCEED-KEYWORDS (NAME ARG) (* amd " 4-Apr-86 14:49")
(LET (TEST REPORT)
(MULTIPLE-VALUE-BIND
(KEYS TAIL)
(STRIP-KEYWORDS ARG)
(for PAIR in KEYS
do (DESTRUCTURING-BIND (KEY VALUE)
PAIR
(CASE KEY (:TEST (CL:IF TEST (CL:ERROR
"Duplicate test form specified for proceed type ~S."
NAME))
(SETF TEST VALUE))
(:CONDITION (CL:IF TEST (CL:ERROR
"Duplicate test form specified for proceed type ~S."
NAME))
(SETF TEST (BQUOTE (CL:LAMBDA (C)
(CONDITION-TYPEP C (QUOTE (\, VALUE)))))
))
(:REPORT-FUNCTION (CL:IF REPORT (CL:ERROR
"Duplicate report form specified for proceed type ~S."
NAME))
(SETF REPORT VALUE))
(:REPORT (CL:IF REPORT (CL:ERROR
"Duplicate report form specified for proceed type ~S."
NAME))
(SETF REPORT (MAKE-REPORT-FUNCTION VALUE (QUOTE PROCEED-CASE))))
(OTHERWISE (CERROR "Ignore key/value pair"
"Illegal keyword ~S in proceed case ~S." KEY NAME)))))
(VALUES TEST REPORT TAIL))))
(DEFUN DEFAULT-PROCEED-REPORTER (PC STREAM) (FORMAT STREAM "Proceed-type: ~A" (PROCEED-CASE-NAME
PC)))
(DEFUN CHECK-*CASE-SELECTOR (SELECTOR NAME) (* amd "15-Apr-86 18:30")
(CL:IF (OR (EQ SELECTOR (QUOTE T))
(EQ SELECTOR (QUOTE OTHERWISE)))
(CL:ERROR "~A not allowed in the ~A form." SELECTOR NAME)
SELECTOR))
(DEFUN COLLECT-CASE-SELECTORS (CLAUSES NAME)
(MAPCAN (FUNCTION (LAMBDA (CLAUSE)
(if (AND (CONSP (CAR CLAUSE))
(FMEMB NAME (QUOTE (CTYPECASE ETYPECASE))))
then (CL:MAPCAR (FUNCTION (LAMBDA (SELECTOR)
(CHECK-*CASE-SELECTOR SELECTOR NAME)))
(CAR CLAUSE))
else (LIST (CHECK-*CASE-SELECTOR (CAR CLAUSE)
NAME)))))
CLAUSES))
(DEFUN FIX-INHERITANCE-LINKS (NAME NEW-PARENT) (LET ((OLD-PARENT (GET NAME (QUOTE %%CONDITION-PARENT)
)))
(CL:UNLESS (OR (EQ NEW-PARENT OLD-PARENT)
(NULL OLD-PARENT))
(LET ((CHILDREN (GET OLD-PARENT
(QUOTE
%%CONDITION-CHILDREN
))))
(SETF (GET OLD-PARENT (QUOTE
%%CONDITION-CHILDREN
))
(DREMOVE NAME CHILDREN))))
(CL:PUSHNEW NAME (GET NEW-PARENT (QUOTE
%%CONDITION-CHILDREN
)))
(SETF (GET NAME (QUOTE %%CONDITION-PARENT))
NEW-PARENT)))
(DEFUN MAKE-INTO-CONDITION (DATUM DESIRED-TYPE ARGS) (* amd " 9-Apr-86 19:52")
(if (CONDITION-TYPEP DATUM (QUOTE CONDITION))
then (* work-around until conditions are
real)
DATUM
else (TYPECASE DATUM (SYMBOL (CL:WHEN (CONDITION-SUBTYPEP DATUM (QUOTE CONDITION))
(CL:APPLY (FUNCTION MAKE-CONDITION)
DATUM ARGS)))
(STRING (MAKE-CONDITION DESIRED-TYPE :FORMAT-STRING DATUM :FORMAT-ARGUMENTS ARGS))
(T NIL))))
(DEFUN RAISE-SIGNAL (C) (* amd "31-Mar-86 19:15")
(for CHB-TAIL on *CONDITION-HANDLER-BINDINGS* bind BINDING eachtime (SETQ BINDING (CAR CHB-TAIL))
do (if (CONDITION-TYPEP C (CAR BINDING))
then (LET ((*CONDITION-HANDLER-BINDINGS* (CDR CHB-TAIL)))
(FUNCALL (CDR BINDING)
C))))
(DEFAULT-HANDLE-CONDITION C)
C)
(DEFUN NO-PROCEED-TEST (NAME &AUX ONCE) (PROCEED-CASE
(CONDITION-BIND
((NO-PROCEED-TEST (FUNCTION (LAMBDA (C)
(CL:WHEN
(EQ (NO-PROCEED-TEST-NAME
C)
NAME)
(CL:IF ONCE
(THROW (QUOTE
SKIP-PROCEED-CASE
)
NIL)
(SETF ONCE T)))))))
(CL:ERROR (QUOTE NO-PROCEED-TEST)
:NAME NAME))
(NIL NIL :REPORT "Use FALSE for the test" :CONDITION
NO-PROCEED-TEST (FUNCTION FALSE))
(PROCEED NIL :REPORT "Make TRUE the default test" :CONDITION
NO-PROCEED-TEST (SETF (DEFAULT-PROCEED-TEST NAME)
(CL:FUNCTION TRUE)))))
(DEFUN TEST-PROCEED-CASE (PC CONDITION &AUX TEST) (* amd " 4-Apr-86 15:38")
(COND
((SETF TEST (PROCEED-CASE-TEST PC))
(FUNCALL TEST CONDITION))
((AND (PROCEED-CASE-NAME PC)
(SETF TEST (OR (DEFAULT-PROCEED-TEST (PROCEED-CASE-NAME PC))
(NO-PROCEED-TEST (PROCEED-CASE-NAME PC)))))
(FUNCALL TEST CONDITION))
(T (* "This case shouldn't happen")
(PROCEED-CASE (CL:ERROR "Couldn't find test function for ~S." PC)
(PROCEED NIL :TEST TRUE :REPORT "Assume proceed case is enabled" T)))))
(DEFUN DEFAULT-HANDLE-CONDITION (CONDITION) (* amd " 9-Apr-86 20:20")
(CL:DO ((TYPE (CONDITION-TYPE-OF CONDITION)
(GET TYPE (QUOTE %%CONDITION-PARENT))))
((NULL TYPE))
(LET ((HANDLER (CONDITION-HANDLER TYPE)))
(CL:WHEN HANDLER (FUNCALL HANDLER CONDITION)))))
(DEFMACRO ERR::WITH-LOOP-VARS (PREFIX &BODY BODY) (BQUOTE (LET ((VAL (GENSYM (\, PREFIX)))
(BLOCK-NAME (GENSYM (\, PREFIX)))
(AGAIN (GENSYM (\, PREFIX))))
(\,@ BODY))))
(* * "User-visible forms.")
(DEFVAR *BREAK-ON-WARNINGS* NIL)
(DEFDEFINER DEFINE-CONDITION
STRUCTURES
(NAME PARENT-TYPE &REST ARGS)
"Defines a new condition type"
(LET ((CLASS-OPTIONS (BQUOTE ((:CONSTRUCTOR (\, (%%PREFIX-SYMBOL "%%MAKE-" NAME)))
(:COPIER NIL)
(:PREDICATE NIL))))
REPORTER HANDLER)
(MULTIPLE-VALUE-BIND
(KEYS SLOT-DESCRIPTIONS)
(STRIP-KEYWORDS ARGS)
(for PAIR in KEYS do (DESTRUCTURING-BIND
(KEY VALUE)
PAIR
(CASE KEY (:CONC-NAME (CL:PUSH PAIR CLASS-OPTIONS))
(:REPORT-FUNCTION (if REPORTER
then (CL:ERROR
"Report function already specified for ~S."
NAME)
else (SETF REPORTER VALUE)))
(:REPORT (if REPORTER
then (CL:ERROR
"Report function already specified for ~S."
NAME)
else (SETF REPORTER (MAKE-REPORT-FUNCTION
VALUE
(QUOTE CONDITION)))))
(:HANDLE (CL:UNLESS HANDLER (SETF HANDLER VALUE)))
(OTHERWISE (CERROR "Skip key-value pair"
"Illegal keyword ~S in DEFINE-CONDITION." KEY)
))))
(SETF SLOT-DESCRIPTIONS (NORMALIZE-SLOT-DESCRIPTIONS SLOT-DESCRIPTIONS))
(AND (NEQ PARENT-TYPE NAME)
(LET* ((ALL-SUPER-SLOTS (SLOT-LIST PARENT-TYPE))
(REDEFINED-SLOTS (for SLOT in SLOT-DESCRIPTIONS
when (CL:MEMBER (CAR SLOT)
ALL-SUPER-SLOTS :KEY (FUNCTION (CL:LAMBDA
(X)
(SLOT-NAME
X))))
collect SLOT)))
(CL:PUSH (LIST* :INCLUDE PARENT-TYPE REDEFINED-SLOTS)
CLASS-OPTIONS)
(SETF SLOT-DESCRIPTIONS (for SLOT in SLOT-DESCRIPTIONS
unless (CL:MEMBER SLOT REDEFINED-SLOTS) collect SLOT))
))
(BQUOTE (PROGN (DEFSTRUCT ((\, NAME) (:TYPE LIST)
:NAMED
(\,@ CLASS-OPTIONS)) (\,@ SLOT-DESCRIPTIONS) )
(\,@ (CL:IF (NEQ NAME PARENT-TYPE)
(BQUOTE ((FIX-INHERITANCE-LINKS (QUOTE (\, NAME))
(QUOTE (\, PARENT-TYPE)))))))
(\,@ (CL:IF (CONSP HANDLER)
(LET ((HANDLER-NAME (%%SUFFIX-SYMBOL NAME "-condition-handler")))
(PROG1 (BQUOTE ((SETF (SYMBOL-FUNCTION (QUOTE (\,
HANDLER-NAME
)))
(CL:FUNCTION (\, HANDLER)))))
(SETQ HANDLER HANDLER-NAME)))))
(SETF (CONDITION-HANDLER (QUOTE (\, NAME)))
(QUOTE (\, HANDLER)))
(\,@ (CL:IF (CONSP REPORTER)
(LET ((REPORTER-NAME (%%SUFFIX-SYMBOL NAME "-condition-reporter")
))
(PROG1 (BQUOTE ((SETF (SYMBOL-FUNCTION (QUOTE (\,
REPORTER-NAME
)))
(CL:FUNCTION (\, REPORTER)))))
(SETQ REPORTER REPORTER-NAME)))))
(SETF (CONDITION-REPORTER (QUOTE (\, NAME)))
(QUOTE (\, REPORTER)))
(QUOTE (\, NAME)))))))
(DEFMACRO CHECK-TYPE (PLACE TYPESPEC &OPTIONAL STRING)
(ERR::WITH-LOOP-VARS "CHECK-TYPE" (BQUOTE (CL:BLOCK
(\, BLOCK-NAME)
(TAGBODY (\, AGAIN)
(LET (((\, VAL)
(\, PLACE)))
(CL:WHEN (TYPEP (\, VAL)
(QUOTE (\, TYPESPEC)))
(RETURN-FROM (\, BLOCK-NAME)
(\, VAL)))
(SETF (\, PLACE)
(CHECK-TYPE-FAIL T
(QUOTE (\, PLACE))
(\, VAL)
(QUOTE (\, TYPESPEC))
(\, STRING)))
(GO (\, AGAIN))))))))
(DEFMACRO ETYPECASE (KEYFORM &BODY CLAUSES)
(LET ((VALUE (GENSYM "ETYPECASE"))
(CASE-SELECTORS (CONS (QUOTE OR)
(COLLECT-CASE-SELECTORS CLAUSES (QUOTE ETYPECASE)))))
(BQUOTE (LET (((\, VALUE)
(\, KEYFORM)))
(TYPECASE (\, VALUE)
(\,@ CLAUSES)
(T (CHECK-TYPE-FAIL NIL (QUOTE (\, KEYFORM))
(\, VALUE)
(QUOTE (\, CASE-SELECTORS))
NIL)))))))
(DEFMACRO CTYPECASE (KEYPLACE &BODY CLAUSES)
(LET ((CASE-SELECTORS (CONS (QUOTE OR)
(COLLECT-CASE-SELECTORS CLAUSES (QUOTE CTYPECASE)))))
(ERR::WITH-LOOP-VARS
"CTYPECASE"
(BQUOTE (CL:BLOCK (\, BLOCK-NAME)
(TAGBODY (\, AGAIN)
(LET (((\, VAL)
(\, KEYPLACE)))
(RETURN-FROM (\, BLOCK-NAME)
(TYPECASE (\, VAL)
(\,@ CLAUSES)
(T (SETF (\, KEYPLACE)
(CHECK-TYPE-FAIL T (QUOTE (\, KEYPLACE))
(\, VAL)
(QUOTE (\, CASE-SELECTORS))
NIL))
(GO (\, AGAIN))))))))))))
(DEFMACRO ECASE (KEYFORM &REST CLAUSES)
(LET ((VALUE (GENSYM "ECASE"))
(CASE-SELECTORS (COLLECT-CASE-SELECTORS CLAUSES (QUOTE ECASE))))
(CL:IF CASE-SELECTORS (BQUOTE (LET (((\, VALUE)
(\, KEYFORM)))
(CASE (\, VALUE)
(\,@ CLAUSES)
(T (ECASE-FAIL NIL (QUOTE (\, KEYFORM))
(\, VALUE)
(QUOTE (\, CASE-SELECTORS)))))))
(BQUOTE (CL:ERROR "Empty case statement.")))))
(DEFMACRO CCASE (KEYFORM &BODY CLAUSES)
(LET ((CASE-SELECTORS (COLLECT-CASE-SELECTORS CLAUSES (QUOTE CCASE))))
(CL:UNLESS CASE-SELECTORS (CL:ERROR "Empty CCASE."))
(ERR::WITH-LOOP-VARS "CCASE"
(BQUOTE (TAGBODY (\, AGAIN)
(LET (((\, VAL)
(\, KEYFORM)))
(CASE (\, VAL)
(\,@ CLAUSES)
(T (SETF (\, KEYFORM)
(ECASE-FAIL T (QUOTE (\, KEYFORM))
(\, VAL)
(QUOTE (\, CASE-SELECTORS))))
(GO (\, AGAIN))))))))))
(DEFMACRO CL:ASSERT (TEST-FORM &OPTIONAL PLACES STRING &REST ARGS)
(CL:UNLESS (CL:LISTP PLACES)
(CL:ERROR "~S should be a list of places." PLACES))
(ERR::WITH-LOOP-VARS "ASSERT" (BQUOTE (CL:BLOCK (\, BLOCK-NAME)
(TAGBODY (\, AGAIN)
(CL:WHEN (\, TEST-FORM)
(RETURN-FROM (\, BLOCK-NAME)
(VALUES)))
(ASSERT-FAIL (\, STRING)
(\,@ ARGS))
(GO (\, AGAIN)))))))
(DEFMACRO CONDITION-BIND (BINDINGS &REST FORMS) "Eval forms under temporary new condition handlers."
(BQUOTE (LET ((*CONDITION-HANDLER-BINDINGS* (LIST* (\,@ (EXTRACT-CONDITION-BINDINGS (
NORMALIZE-CONDITION-CLAUSES
BINDINGS)))
*CONDITION-HANDLER-BINDINGS*)))
(\,@ FORMS))))
(DEFMACRO CONDITION-CASE (FORM &REST BINDINGS)
"Eval form under temporary condition handlers that return alternate values."
(LET
((CLAUSES (NORMALIZE-CONDITION-CLAUSES BINDINGS))
(CONDITION (GENTEMP "CONDITION-CASE"))
(VALUES (GENTEMP "CONDITION-CASE"))
(BNAME (GENTEMP "CONDITION-CASE"))
(HANDLER (GENTEMP "CONDITION-CASE")))
(if (NULL CLAUSES)
then FORM
else (BQUOTE (LET* (((\, CONDITION)
NIL)
((\, VALUES)
(CONDITION-BLOCK (\, BNAME)
(LET (((\, HANDLER)
(FUNCTION (CL:LAMBDA (C)
(SETF (\, CONDITION)
C)
(CONDITION-RETURN (\, BNAME))))))
(CONDITION-BIND (((\, (CL:MAPCAR (FUNCTION CAR)
CLAUSES))
(\, HANDLER)))
(MULTIPLE-VALUE-LIST (\, FORM)))))))
(CL:IF (\, CONDITION)
(\, (if (EQL (LENGTH CLAUSES)
1)
then (CADR (CAR (MASSAGE-CATCH-CONDITION-CLAUSES CLAUSES
CONDITION)))
else (BQUOTE (CONDITION-TYPECASE (\, CONDITION)
(\,@ (MASSAGE-CATCH-CONDITION-CLAUSES
CLAUSES CONDITION))
(T (CL:ERROR
"Bug in condition-case!~&Unexpected condition: ~S."
(\, CONDITION)))))))
(VALUES-LIST (\, VALUES))))))))
(DEFMACRO IGNORE-ERRORS (&BODY FORMS) "Eval forms with handler for any condition of type ERROR."
(BQUOTE (CONDITION-CASE (PROGN (\,@ FORMS))
(CL:ERROR (CONDITION)
(VALUES NIL CONDITION)))))
(DEFMACRO PROCEED-CASE (FORM &REST CLAUSES)
"Eval forms, establishing a place to proceed from errors."
(LET
((SELECTOR (GENSYM "PROCEED-CASE"))
(VALUES (GENSYM "PROCEED-CASE"))
(TAG (GENSYM "PROCEED-CASE")))
(MULTIPLE-VALUE-BIND
(CASES BODIES)
(SPLIT-PROCEED-CLAUSES CLAUSES TAG)
(if (NULL CASES)
then FORM
else (BQUOTE (DESTRUCTURING-BIND ((\, SELECTOR)
\, VALUES)
(LET (((\, TAG)
(LIST NIL)))
(CATCH (\, TAG)
(CONS :NORMAL (LET ((*PROCEED-CASES* (LIST* (\,@ CASES)
*PROCEED-CASES*)))
(MULTIPLE-VALUE-LIST (\, FORM))))))
(CL:IF (EQ (\, SELECTOR)
:NORMAL)
(VALUES-LIST (\, VALUES))
(CL:APPLY (\, (if (EQL (LENGTH BODIES)
1)
then (CADR (CAR BODIES))
else (BQUOTE (CASE (\, SELECTOR)
(\,@ BODIES)))))
(\, VALUES)))))))))
(DEFDEFINER DEFINE-PROCEED-FUNCTION
FUNCTIONS
(NAME &REST TAIL)
(MULTIPLE-VALUE-BIND
(TEST REPORT VARS)
(PROCESS-PROCEED-KEYWORDS NAME TAIL)
(CL:UNLESS TEST (SETF TEST (QUOTE TRUE)))
(CL:UNLESS REPORT (SETF REPORT (QUOTE DEFAULT-PROCEED-REPORTER)))
(BQUOTE (PROGN (\,@ (CL:IF (CONSP TEST)
(LET ((TESTER (%%SUFFIX-SYMBOL NAME "-proceed-test")))
(PROG1 (BQUOTE ((SETF (SYMBOL-FUNCTION (QUOTE (\, TESTER)))
(CL:FUNCTION (\, TEST)))))
(SETQ TEST TESTER)))))
(SETF (DEFAULT-PROCEED-TEST (QUOTE (\, NAME)))
(QUOTE (\, TEST)))
(\,@ (CL:IF (CONSP REPORT)
(LET ((REPORTER (%%SUFFIX-SYMBOL NAME "-proceed-reporter")))
(PROG1 (BQUOTE ((SETF (SYMBOL-FUNCTION (QUOTE (\, REPORTER)))
(CL:FUNCTION (\, REPORT)))))
(SETQ REPORT REPORTER)))))
(SETF (DEFAULT-PROCEED-REPORT (QUOTE (\, NAME)))
(QUOTE (\, REPORT)))
(DEFUN (\, NAME) (&OPTIONAL CONDITION (\,@ VARS))
(CONDITION-CASE (INVOKE-PROCEED-CASE (QUOTE (\, NAME))
CONDITION
(\,@ (CL:MAPCAR (FUNCTION (CL:LAMBDA (V)
(CL:IF (SYMBOLP V)
V
(CAR V))))
VARS)))
(BAD-PROCEED-CASE NIL NIL)))
))))
(DEFMACRO CATCH-ABORT (PRINT-FORM &BODY FORMS) (BQUOTE (PROCEED-CASE (PROGN (\,@ FORMS))
(ABORT (CONDITION)
:REPORT
(\, PRINT-FORM)
:TEST TRUE (VALUES NIL CONDITION
)))))
(DEFUN SIGNAL (DATUM &REST ARGS) (* amd " 9-Apr-86 19:53")
(LET ((CONDITION (MAKE-INTO-CONDITION DATUM (QUOTE SIMPLE-CONDITION)
ARGS)))
(CL:IF (NULL CONDITION)
(CL:ERROR "Bad argument to SIGNAL ~A." DATUM))
(RAISE-SIGNAL CONDITION)
(if (CONDITION-TYPEP CONDITION (QUOTE SERIOUS-CONDITION))
then (DEBUG CONDITION))
CONDITION))
(DEFUN CERROR (PROCEED-FORMAT-STRING DATUM &REST ARGUMENTS) (* amd " 3-Apr-86 16:46")
(PROCEED-CASE (CL:APPLY (FUNCTION CL:ERROR)
DATUM ARGUMENTS)
(PROCEED NIL :REPORT (CL:APPLY (FUNCTION FORMAT)
T PROCEED-FORMAT-STRING ARGUMENTS)
NIL)))
(DEFUN DEBUG (*DEBUGGED-CONDITION*) (* amd " 9-Apr-86 20:02")
(LET ((MESSAGE (WITH-OUTPUT-TO-STRING (S) (* (FORMAT S "~A" *DEBUGGED-CONDITION*))
(REPORT-CONDITION *DEBUGGED-CONDITION* S))))
(FUNCALL (FUNCTION BREAK1)
NIL T (QUOTE DEBUG)
NIL
(QUOTE ERRORX)
(LIST MESSAGE ""))))
(DEFUN CL:BREAK (DATUM &REST ARGUMENTS) (* AMD "21-Apr-86 15:52")
(DECLARE (SPECVARS NBREAKS))
(LET ((CONDITION (MAKE-INTO-CONDITION DATUM (QUOTE SIMPLE-BREAK)
ARGUMENTS))
(HACK (BQUOTE (CL:LAMBDA (P S)
(FORMAT S "Return from break: ~D" (\, (ADD1 NBREAKS)))))))
(CL:UNLESS CONDITION (CL:ERROR "Bad argument to BREAK: ~S" DATUM))
(* * HACK CL:UNTIL LEXICALITY WORKS...)
(COMMON-LISP (CL:EVAL (BQUOTE (PROCEED-CASE (DEBUG (QUOTE (\, CONDITION)))
(PROCEED (C)
:REPORT-FUNCTION
(CL:LAMBDA (P S)
(FUNCALL (QUOTE (\, HACK))
P S))
C)))))
(* *
"Don't just return the thing that PROCEED gave 'cause it might not be the same condition.")
CONDITION))
(DEFUN COMPUTE-PROCEED-CASES (CONDITION) (* AMD "31-Mar-86 16:42")
(for PC in *PROCEED-CASES* when (CATCH (QUOTE SKIP-PROCEED-CASE)
(TEST-PROCEED-CASE PC CONDITION)) collect PC))
(DEFUN FIND-PROCEED-CASE (DATUM CONDITION) (* amd " 4-Apr-86 15:31")
(TYPECASE DATUM (PROCEED-CASE (AND (CL:MEMBER DATUM *PROCEED-CASES* :TEST (CL:FUNCTION EQ))
(TEST-PROCEED-CASE DATUM CONDITION)
DATUM))
(SYMBOL (for PC in *PROCEED-CASES* thereis (AND (EQ (PROCEED-CASE-NAME PC)
DATUM)
(TEST-PROCEED-CASE PC CONDITION)
PC)))))
(DEFUN INVOKE-PROCEED-CASE (PROCEED-CASE CONDITION &REST VALUES)
(* amd "22-Apr-86 15:19")
(LET ((PC (FIND-PROCEED-CASE PROCEED-CASE CONDITION)))
(IF PC
THEN (AND (BOUNDP (QUOTE BREAKRESETVALS))
(BOUNDP (QUOTE \BREAKRESETEXPR))
(BREAKRESETFN (QUOTE LEAVING))) (* Hack until THROW and RESETLST get
along)
(THROW (PROCEED-CASE-TAG PC)
(LIST* (PROCEED-CASE-SELECTOR PC)
CONDITION VALUES))
ELSE (CL:ERROR (QUOTE BAD-PROCEED-CASE)
:NAME PROCEED-CASE))))
(DEFUN REPORT-CONDITION (CONDITION STREAM) (CL:DO* ((TYPE (CONDITION-TYPE-OF CONDITION)
(GET TYPE (QUOTE %%CONDITION-PARENT)))
(REPORTER (CONDITION-REPORTER TYPE)
(CONDITION-REPORTER TYPE)))
((NULL TYPE)
(CL:ERROR "No report function found for ~S."
CONDITION))
(CL:WHEN REPORTER (PROGN (FUNCALL REPORTER
CONDITION STREAM)
(RETURN)))))
(PUTPROPS %%CONDITION-HANDLER PROPTYPE STRUCTURES)
(PUTPROPS %%CONDITION-REPORTER PROPTYPE STRUCTURES)
(DEFINE-PROCEED-FUNCTION ABORT :TEST TRUE :REPORT "Abort")
(DEFINE-PROCEED-FUNCTION PROCEED :TEST TRUE)
(DEFINEQ
(MAKE-CONDITION
(CL:LAMBDA (TYPE &REST SLOT-INITIALIZATIONS) (* lmm " 9-May-86 15:04")
(CL:APPLY (STRUCTURE-CONSTRUCTOR TYPE)
SLOT-INITIALIZATIONS)))
)
(DEFINE-CONDITION CONDITION CONDITION)
(DEFINE-CONDITION SIMPLE-CONDITION CONDITION :REPORT (CL:APPLY (FUNCTION FORMAT)
T
(SIMPLE-CONDITION-FORMAT-STRING CONDITION
)
(SIMPLE-CONDITION-FORMAT-ARGUMENTS
CONDITION))
FORMAT-STRING FORMAT-ARGUMENTS)
(DEFINE-CONDITION WARNING CONDITION)
(DEFINE-CONDITION SIMPLE-WARNING WARNING :REPORT (CL:APPLY (FUNCTION FORMAT)
T
(SIMPLE-WARNING-FORMAT-STRING CONDITION)
(SIMPLE-WARNING-FORMAT-ARGUMENTS CONDITION))
FORMAT-STRING FORMAT-ARGUMENTS)
(DEFINE-CONDITION SERIOUS-CONDITION CONDITION)
(DEFINE-CONDITION SIMPLE-BREAK SERIOUS-CONDITION :REPORT (CL:APPLY (FUNCTION FORMAT)
T
(SIMPLE-BREAK-FORMAT-STRING CONDITION
)
(SIMPLE-BREAK-FORMAT-ARGUMENTS
CONDITION))
FORMAT-STRING FORMAT-ARGUMENTS)
(DEFINE-CONDITION CL:ERROR SERIOUS-CONDITION)
(DEFINE-CONDITION SIMPLE-ERROR CL:ERROR :REPORT (CL:APPLY (FUNCTION FORMAT)
T
(SIMPLE-ERROR-FORMAT-STRING CONDITION)
(SIMPLE-ERROR-FORMAT-ARGUMENTS CONDITION))
FORMAT-STRING FORMAT-ARGUMENTS)
(DEFINE-CONDITION ASSERTION-FAILED SIMPLE-ERROR :REPORT (CL:APPLY (FUNCTION FORMAT)
T
(OR (ASSERTION-FAILED-FORMAT-STRING
CONDITION)
"Assertion failed.")
(ASSERTION-FAILED-FORMAT-ARGUMENTS
CONDITION)))
(DEFINE-CONDITION CELL-ERROR CL:ERROR NAME)
(DEFINE-CONDITION UNBOUND-VARIABLE CELL-ERROR :REPORT (FORMAT T "Unbound variable: ~S." (
UNBOUND-VARIABLE-NAME
CONDITION)))
(DEFINE-CONDITION UNDEFINED-FUNCTION CELL-ERROR :REPORT (FORMAT T "Undefined function: ~S."
(UNDEFINED-FUNCTION-NAME CONDITION)))
(DEFINE-CONDITION NO-PROCEED-TEST UNDEFINED-FUNCTION :REPORT (FORMAT T
"No test specified for proceed case: ~S."
(UNDEFINED-FUNCTION-NAME
CONDITION)))
(DEFINE-CONDITION INDEX-BOUNDS-ERROR CELL-ERROR :REPORT (FORMAT T "Index out of bounds: ~D."
(INDEX-BOUNDS-ERROR-INDEX CONDITION))
INDEX)
(DEFINE-CONDITION CALL-ERROR CONTROL-ERROR CALLEE)
(DEFSTRUCT (PROCEED-CASE (:PRINT-FUNCTION (CL:LAMBDA (PC STREAM LEVEL)
(CL:IF *PRINT-ESCAPE* (DEFAULT-STRUCTURE-PRINTER
PC STREAM LEVEL)
(FUNCALL (PROCEED-CASE-REPORT PC)
PC STREAM))
T))) NAME TAG SELECTOR TEST REPORT)
(DEFINE-CONDITION TOO-MANY-ARGUMENTS CALL-ERROR :REPORT (FORMAT T "Too many arguments to ~A: ~A"
(TOO-MANY-ARGUMENTS-CALLEE CONDITION)
(TOO-MANY-ARGUMENTS-EXTRA-VALUES
CONDITION))
EXTRA-VALUES)
(DEFUN PRETTY-TYPE-NAME (TYPESPEC) (CONCAT "a " TYPESPEC))
(DEFUN REPORT-TYPE-MISMATCH (C S) (FORMAT S "The value of ~A, ~A, is not ~A." (TYPE-MISMATCH-NAME
C)
(TYPE-MISMATCH-VALUE C)
(if (TYPE-MISMATCH-MESSAGE C)
then (TYPE-MISMATCH-MESSAGE C)
else (PRETTY-TYPE-NAME (TYPE-MISMATCH-DESIRED-TYPE C)))))
(DEFINE-CONDITION TYPE-MISMATCH CELL-ERROR :REPORT-FUNCTION REPORT-TYPE-MISMATCH VALUE DESIRED-TYPE
MESSAGE)
(DEFINE-CONDITION CONTROL-ERROR CL:ERROR)
(DEFINE-CONDITION BAD-PROCEED-CASE CONTROL-ERROR)
(DEFINE-CONDITION ILLEGAL-GO CONTROL-ERROR :REPORT (FORMAT T "GO to a non-existant tag: ~S."
(ILLEGAL-GO-TAG CONDITION))
TAG)
(DEFINE-CONDITION ILLEGAL-RETURN CONTROL-ERROR :REPORT (FORMAT T "RETURN to non-existant block: ~S."
(ILLEGAL-RETURN-TAG CONDITION))
TAG)
(DEFINE-CONDITION ILLEGAL-THROW CONTROL-ERROR :REPORT (FORMAT T "Tag for THROW not found: ~S."
(ILLEGAL-THROW-TAG CONDITION))
TAG)
(DEFINE-CONDITION STREAM-ERROR CL:ERROR STREAM)
(DEFINE-CONDITION READ-ERROR STREAM-ERROR)
(DEFINE-CONDITION END-OF-FILE READ-ERROR)
(DEFINE-CONDITION STORAGE-CONDITION SERIOUS-CONDITION)
(DEFINE-CONDITION STACK-OVERFLOW STORAGE-CONDITION)
(DEFINE-CONDITION STORAGE-EXHAUSTED STORAGE-CONDITION)
(DEFINE-PROCEED-FUNCTION USE-VALUE :REPORT "Use a different value" :TEST TRUE
(VALUE (PROGN (FORMAT T "Enter a new value: ")
(EVAL (READ)))))
(* * "Environment stuff.")
(DEFUN PROCEED-FROM-BREAK NIL (LET ((KEYS (CREATE-PROCEED-KEYLIST *DEBUGGED-CONDITION*)))
(CL:IF KEYS (LET ((CASE (PROGN (ASKUSEREXPLAIN KEYS NIL NIL "
")
(ASKUSER NIL NIL "Proceed how? "
KEYS T))))
(CL:WHEN CASE (PROCEED-WITH-DEFAULTS CASE
*DEBUGGED-CONDITION*)))
(FORMAT *DEBUG-IO* "~&No proceed cases enabled.~%%"))))
(DEFUN PROCEED-WITH-DEFAULTS (CASE CONDITION) (* amd "21-Apr-86 15:44")
(LET* ((NAME (PROCEED-CASE-NAME CASE))
(ARGS (AND NAME (FBOUNDP NAME)
(EVAL (BQUOTE (PROCEED-CASE ((\, NAME)
(QUOTE (\, CONDITION)))
((\, NAME)
(IGNORE &REST ARGS)
:TEST TRUE ARGS)))))))
(CL:APPLY (FUNCTION INVOKE-PROCEED-CASE)
CASE CONDITION ARGS)))
(DEFUN CREATE-PROCEED-KEYLIST (CONDITION) (* amd "15-Apr-86 19:06")
(LET ((CASES (COMPUTE-PROCEED-CASES CONDITION)))
(CL:WHEN CASES (LET ((KEYLIST (for CASE in CASES as I from 1 bind MESSAGE
eachtime (SETQ MESSAGE (FORMAT NIL "~A " CASE))
collect (BQUOTE ((\, I)
(\, MESSAGE)
NOECHOFLG T EXPLAINSTRING
(\, (CONCAT I " - " MESSAGE))
CONFIRMFLG T RETURN
(PROGN (TERPRI T)
(QUOTE (\, CASE))))))))
(SETF (CDR (LAST KEYLIST))
(QUOTE (("N" "No - don't proceed " NOECHOFLG T CONFIRMFLG T
AUTOCONFIRMFLG T RETURN (TERPRI T)))))
KEYLIST))))
(DEFUN PROCEED-USING-MENU NIL (* amd "21-Apr-86 15:41")
(LET ((MENU (CREATE-PROCEED-MENU *DEBUGGED-CONDITION*)))
(CL:IF MENU (LET ((CASE (MENU MENU)))
(CL:WHEN CASE (PROCEED-WITH-DEFAULTS CASE
*DEBUGGED-CONDITION*)))
(FORMAT *DEBUG-IO* "~&No proceed cases enabled.~%%"))))
(DEFUN CREATE-PROCEED-MENU (CONDITION) (* amd "25-Apr-86 14:53")
(LET ((CASES (COMPUTE-PROCEED-CASES CONDITION)))
(CL:WHEN CASES (create MENU
TITLE ← "Ways to proceed..."
ITEMS ← (CL:MAPCAR (FUNCTION (LAMBDA (CASE)
(LIST (FORMAT NIL "~A" CASE)
CASE)))
CASES)))))
(ADDTOVAR BREAKMACROS (PR (PROCEED-FROM-BREAK)))
(DEFUN WARN (DATUM &REST ARGUMENTS) (LET ((CONDITION (MAKE-INTO-CONDITION DATUM (QUOTE SIMPLE-WARNING
)
ARGUMENTS)))
(CL:WHEN (NULL CONDITION)
(CL:ERROR "Bad argument ~S to WARN." DATUM))
(RAISE-SIGNAL CONDITION)
(if *BREAK-ON-WARNINGS*
then (CL:BREAK CONDITION)
else (FORMAT *ERROR-OUTPUT* "~&Warning: ~A~%%"
(WITH-OUTPUT-TO-STRING (S)
(REPORT-CONDITION CONDITION S))))
CONDITION))
(DEFUN CL:ERROR (DATUM &REST ARGS) (* amd " 4-Apr-86 16:41")
(LET ((CONDITION (MAKE-INTO-CONDITION DATUM (QUOTE SIMPLE-ERROR)
ARGS)))
(CL:IF (NULL CONDITION)
(CL:ERROR "Bad argument to ERROR ~A." DATUM))
(RAISE-SIGNAL CONDITION)
(DEBUG CONDITION)))
(PUTPROPS CL-ERROR FILETYPE COMPILE-FILE)
(DECLARE: DONTEVAL@LOAD DOEVAL@COMPILE DONTCOPY COMPILERVARS
(ADDTOVAR NLAMA )
(ADDTOVAR NLAML )
(ADDTOVAR LAMA MAKE-CONDITION)
)
(PUTPROPS CL-ERROR COPYRIGHT ("Xerox Corporation" 1986))
(DECLARE: DONTCOPY
(FILEMAP (NIL (47972 48186 (MAKE-CONDITION 47982 . 48184)))))
STOP