(FILECREATED " 3-Oct-86 19:19:38" {ERIS}<DANIELS>LISP>CL-ERROR.;8 37921 changes to: (FUNCTIONS MAKE-ENCAPSULATION DEFINE-CONDITION REPORT-CONDITION CONDITION-TYPECASE DEFAULT-PROCEED-REPORT WITH-GENSYMS WITH-ERR-LOOP-VARS STRIP-KEYWORDS NORMALIZE-SLOT-DESCRIPTIONS EXTRACT-CONDITION-BINDINGS NORMALIZE-CONDITION-CLAUSES MASSAGE-CATCH-CONDITION-CLAUSES PROCESS-PROCEED-KEYWORDS CHECK-*CASE-SELECTOR NO-PROCEED-TEST ETYPECASE ECASE HANDLER-BIND CONDITION-BIND CONDITION-CASE REAL-CONDITION-CASE PROCEED-CASE) (VARS CL-ERRORCOMS) (VARIABLES %%CONDITION-TYPES-REAL) previous date: " 3-Oct-86 18:39:23" {ERIS}<DANIELS>LISP>CL-ERROR.;7) (* " 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-TYPECASE CONDITION-BLOCK CONDITION-RETURN)) (COMS (* ;; "Internal stuff.") (EXPORT (VARIABLES %%CONDITION-TYPES-REAL)) (FUNCTIONS DEFAULT-PROCEED-REPORT) (FUNCTIONS WITH-GENSYMS WITH-ERR-LOOP-VARS STRIP-KEYWORDS MAKE-REPORT-FUNCTION MAKE-ENCAPSULATION NORMALIZE-SLOT-DESCRIPTIONS EXTRACT-CONDITION-BINDINGS NORMALIZE-CONDITION-CLAUSES MASSAGE-CATCH-CONDITION-CLAUSES SPLIT-PROCEED-CLAUSES PROCESS-PROCEED-KEYWORDS CHECK-*CASE-SELECTOR COLLECT-CASE-SELECTORS NO-PROCEED-TEST %%PREFIX-SYMBOL %%SUFFIX-SYMBOL PROCEED-ARG-COLLECTOR)) (COMS (* ;; "User-visible forms.") (FUNCTIONS DEFINE-CONDITION CHECK-TYPE ETYPECASE CTYPECASE ECASE CCASE CL:ASSERT HANDLER-BIND CONDITION-BIND CONDITION-CASE REAL-CONDITION-CASE IGNORE-ERRORS PROCEED-CASE DEFINE-PROCEED-FUNCTION CATCH-ABORT)) (PROP FILETYPE CL-ERROR) (DECLARE: DONTEVAL@LOAD DOEVAL@COMPILE DONTCOPY COMPILERVARS (ADDVARS (NLAMA) (NLAML) (LAMA))))) (* ;; "Temporary bootstrapping stuff. Anything in here gets changed once CL starts working.") (DEFMACRO CONDITION-TYPECASE (OBJECT &REST CLAUSES) (LET ((VAL (GENTEMP))) (CL:IF %%CONDITION-TYPES-REAL (BQUOTE (TYPECASE (\, OBJECT) (\,@ CLAUSES))) (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)))) (* ;; "Internal stuff.") (* FOLLOWING DEFINITIONS EXPORTED) (DEFCONSTANT %%CONDITION-TYPES-REAL NIL) (* END EXPORTED DEFINITIONS) (DEFMACRO DEFAULT-PROCEED-REPORT (PROCEED-TYPE) (BQUOTE (GET (\, PROCEED-TYPE) (QUOTE %%DEFAULT-PROCEED-REPORT) (QUOTE DEFAULT-PROCEED-REPORTER)))) (DEFMACRO WITH-GENSYMS (VARS PREFIX &BODY BODY) (BQUOTE (LET (\, (MAPCAR VARS (FUNCTION (CL:LAMBDA (VAR) (BQUOTE ((\, VAR) (GENSYM (\, PREFIX)))))))) (\,@ BODY)))) (DEFMACRO WITH-ERR-LOOP-VARS (PREFIX &BODY BODY) (BQUOTE (WITH-GENSYMS (VAL BLOCK-NAME AGAIN) (\, PREFIX) (\,@ BODY)))) (DEFUN STRIP-KEYWORDS (ARGS) (VALUES (FOR OLD ARGS ON ARGS BY CDDR WHILE (KEYWORDP (CL:FIRST ARGS)) COLLECT (LIST (CL:FIRST ARGS) (SECOND ARGS))) ARGS)) (DEFUN MAKE-REPORT-FUNCTION (DATUM BOUND-VAR &OPTIONAL ENCAPSULATION) (ETYPECASE DATUM (STRING (BQUOTE (LAMBDA (DATUM STREAM) (DECLARE (IGNORE DATUM)) (WRITE-STRING (\, DATUM) STREAM)))) (LIST (BQUOTE (LAMBDA ((\, BOUND-VAR) *STANDARD-OUTPUT*) (\, (CL:IF (NULL ENCAPSULATION) DATUM (BQUOTE (LET (\, ENCAPSULATION) (\, DATUM)))))))))) (DEFUN MAKE-ENCAPSULATION (CONDITION-TYPE SLOT-NAMES) (MAPCAR (CL:REMOVE (QUOTE --DUMMY-SLOT--) SLOT-NAMES) (CL:FUNCTION (LAMBDA (SLOT) (BQUOTE ((\, SLOT) ((\, (%%SUFFIX-SYMBOL CONDITION-TYPE (CONCATENATE (QUOTE STRING) "-" (SYMBOL-NAME SLOT)))) CONDITION))))))) (DEFUN NORMALIZE-SLOT-DESCRIPTIONS (SLOTS) (MAPCAR SLOTS (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))))))) (DEFUN EXTRACT-CONDITION-BINDINGS (CLAUSES) (MAPCAR CLAUSES (FUNCTION (CL:LAMBDA (CLAUSE) (BQUOTE (CONS (QUOTE (\, (CL:FIRST CLAUSE))) (\, (SECOND CLAUSE)))))))) (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) (MAPCAR CONDITIONS (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)))))) ) (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) (MAPCAR CLAUSES (FUNCTION (CL:LAMBDA (CLAUSE) (DESTRUCTURING-BIND (SELECTOR BVL . FORMS) CLAUSE (CL:IF (NULL BVL) (CONS SELECTOR FORMS) (LIST SELECTOR (BQUOTE (LET ((\, (LIST (CAR BVL) INIT-VALUE)) (\,@ (CDR BVL))) (\,@ FORMS)))))))))) (DEFUN SPLIT-PROCEED-CLAUSES (CLAUSES TAG) (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-TEST))) 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 (\, (AND TEST (BQUOTE (CL: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) (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 CHECK-*CASE-SELECTOR (SELECTOR NAME) (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 (ECASE CCASE)))) then (COPY-LIST (CAR CLAUSE)) else (LIST (CHECK-*CASE-SELECTOR (CAR CLAUSE) NAME))))) CLAUSES)) (DEFUN NO-PROCEED-TEST (NAME &AUX ONCE) (PROCEED-CASE (HANDLER-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 %%PREFIX-SYMBOL (PREFIX SYMBOL) (INTERN (CONCATENATE (QUOTE STRING) PREFIX (SYMBOL-NAME SYMBOL)) (SYMBOL-PACKAGE SYMBOL))) (DEFUN %%SUFFIX-SYMBOL (SYMBOL SUFFIX) (INTERN (CONCATENATE (QUOTE STRING) (SYMBOL-NAME SYMBOL) SUFFIX) (SYMBOL-PACKAGE SYMBOL))) (DEFMACRO PROCEED-ARG-COLLECTOR (NAME) (BQUOTE (GET (\, NAME) (QUOTE %%PROCEED-ARG-COLLECTOR)))) (* ;; "User-visible forms.") (DEFDEFINER DEFINE-CONDITION STRUCTURES (NAME PARENT-TYPE &REST ARGS) "Defines a new condition type" (FLET ((EXTRACT-SLOT-NAME (X) (SLOT-NAME X))) (LET ((CLASS-OPTIONS (BQUOTE ((\,@ (CL:IF %%CONDITION-TYPES-REAL (QUOTE ((:PRINT-FUNCTION %%PRINT-CONDITION))) (QUOTE ((:TYPE LIST) :NAMED)))) (:CONSTRUCTOR (\, (%%PREFIX-SYMBOL "%%MAKE-" NAME))) (:COPIER NIL) (:PREDICATE NIL)))) REPORTER HANDLER ENCAPSULATION) (MULTIPLE-VALUE-BIND (KEYS SLOT-DESCRIPTIONS) (STRIP-KEYWORDS ARGS) (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 (CL:FUNCTION EXTRACT-SLOT-NAME )) 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)))) (SETF ENCAPSULATION (MAKE-ENCAPSULATION NAME (NCONC (MAPCAR (SLOT-LIST PARENT-TYPE) (CL:FUNCTION EXTRACT-SLOT-NAME)) (MAPCAR SLOT-DESCRIPTIONS (CL:FUNCTION EXTRACT-SLOT-NAME ))))) (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) ENCAPSULATION)))) (:HANDLER-FUNCTION (IF HANDLER THEN (CL:ERROR "Handler already specified for ~S." NAME) ELSE (SETF HANDLER VALUE))) (:HANDLE (IF HANDLER THEN (CL:ERROR "Handler already specified for ~S." NAME) ELSE (SETF HANDLER (BQUOTE (LAMBDA (CONDITION) (\, (CL:IF (NULL ENCAPSULATION) VALUE (BQUOTE (LET (\, ENCAPSULATION) (\, VALUE)))))))))) (OTHERWISE (CERROR "Skip key-value pair" "Illegal keyword ~S in ~S." KEY (QUOTE DEFINE-CONDITION )))))) (BQUOTE (PROGN ((\, (CL:IF %%CONDITION-TYPES-REAL (QUOTE MDEFSTRUCT) (QUOTE DEFSTRUCT))) ((\, NAME) (\,@ 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 " default 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 " report method"))) (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) (WITH-ERR-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) (WITH-GENSYMS (VALUE) "ETYPECASE" (LET ((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))))) (WITH-ERR-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) (WITH-GENSYMS (VALUE) "ECASE" (LET ((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.")) (WITH-ERR-LOOP-VARS "CCASE" (BQUOTE (CL:BLOCK (\, BLOCK-NAME) (TAGBODY (\, AGAIN) (LET (((\, VAL) (\, KEYFORM))) (RETURN-FROM (\, BLOCK-NAME) (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)) (WITH-ERR-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 HANDLER-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-BIND (BINDINGS &REST FORMS) "Eval forms under temporary new condition handlers; synonym for HANDLER-BIND" (BQUOTE (HANDLER-BIND (\, BINDINGS) (\,@ FORMS)))) (DEFMACRO CONDITION-CASE (FORM &REST BINDINGS) "Eval form under temporary condition handlers that return alternate values." (WITH-GENSYMS (CONDITION VALUES BNAME HANDLER) "CONDITION-CASE" (LET ((CLAUSES (NORMALIZE-CONDITION-CLAUSES BINDINGS))) (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)))))) (HANDLER-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 REAL-CONDITION-CASE (FORM &REST CASES) (WITH-GENSYMS (OUTER INNER CONDITION DUMMY) "CONDITION-CASE" (BQUOTE (CL:BLOCK (\, OUTER) (MULTIPLE-VALUE-CALL (CL:FUNCTION FUNCALL) (CL:BLOCK (\, INNER) (HANDLER-BIND (\, (FOR CASE IN CASES COLLECT (DESTRUCTURING-BIND (TYPES BVL . BODY) CASE (BQUOTE ((\, TYPES) (CL:FUNCTION (CL:LAMBDA ((\, CONDITION)) (RETURN-FROM (\, INNER) (VALUES (CL:FUNCTION (CL:LAMBDA (\,@ (CL:IF BVL (LIST BVL) (BQUOTE (((\, DUMMY)) (DECLARE (IGNORE (\, DUMMY))))))) (\,@ BODY))) (\, CONDITION)))))))))) (RETURN-FROM (\, OUTER) (\, FORM))))))))) (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." (WITH-GENSYMS (SELECTOR VALUES TAG) "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 &AUX VARS) (MULTIPLE-VALUE-BIND (TEST REPORT ARGLIST) (PROCESS-PROCEED-KEYWORDS NAME TAIL) (SETF VARS (MAPCAR ARGLIST (CL:FUNCTION (LAMBDA (X) (CL:IF (SYMBOLP X) X (CAR X)))))) (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))) (SETF (PROCEED-ARG-COLLECTOR (QUOTE (\, NAME))) (CL:FUNCTION (CL:LAMBDA (&OPTIONAL CONDITION (\,@ ARGLIST)) (LIST (\,@ VARS))))) (DEFUN (\, NAME) (&OPTIONAL CONDITION (\,@ ARGLIST)) (CONDITION-CASE (INVOKE-PROCEED-CASE (QUOTE (\, NAME)) CONDITION (\,@ 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 ))))) (PUTPROPS CL-ERROR FILETYPE COMPILE-FILE) (DECLARE: DONTEVAL@LOAD DOEVAL@COMPILE DONTCOPY COMPILERVARS (ADDTOVAR NLAMA ) (ADDTOVAR NLAML ) (ADDTOVAR LAMA ) ) (PUTPROPS CL-ERROR COPYRIGHT ("Xerox Corporation" 1986)) (DECLARE: DONTCOPY (FILEMAP (NIL))) STOP