Common Lisp the Language, 2nd Edition
The syntax for etypecase and ctypecase is the same as for typecase, except that no otherwise clause is permitted. Similarly, the syntax for ecase and ccase is the same as for case except for the otherwise clause.
etypecase and ecase are similar to typecase and case, respectively, but signal a non-continuable error rather than returning nil if no clause is selected.
ctypecase and ccase are also similar to typecase and case, but signal a continuable error if no clause is selected.
[Macro]
etypecase keyform {(type {form}*)}*
This control construct is similar to typecase,
but no explicit otherwise or t clause is permitted.
If no clause is satisfied, etypecase signals an error with
a message constructed from the clauses. It is not permissible to
continue from this error. To supply an application-specific error message, the
user should use typecase with an otherwise clause containing a call
to error. The name of this function stands for ``exhaustive
type case'' or ``error-checking type case.''
For example:
(setq x 1/3) (etypecase x (integer x) (symbol (symbol-value x))) Error: The value of X, 1/3, is neither an integer nor a symbol. >
X3J13 voted in June 1988
(CONDITION-SYSTEM)
to adopt a proposal for a Common Lisp Condition System.
This proposal modifies the definition of etypecase to specify its
interaction with the condition system.
See section 29.4.3.
[Macro]
ctypecase keyplace {(type {form}*)}*
This control construct is similar to typecase,
but no explicit otherwise or t clause is permitted.
The keyplace must be a generalized variable reference
acceptable to setf. If no clause is satisfied, ctypecase signals an
error with a message constructed from the clauses. Continuing from this
error causes ctypecase to accept a new value from the user, store
it into keyplace, and start over, making the type tests again.
Subforms of keyplace may be evaluated multiple times. The name
of this function stands for ``continuable exhaustive type case.''
X3J13 voted in June 1988
(CONDITION-SYSTEM)
to adopt a proposal for a Common Lisp Condition System.
This proposal modifies the definition of ctypecase to specify its
interaction with the condition system.
See section 29.4.3.
X3J13 voted in March 1988 (PUSH-EVALUATION-ORDER)
to clarify order of evaluation (see section 7.2).
[Macro]
ecase keyform {({({key}*) | key} {form}*)}*
This control construct is similar to case,
but no explicit otherwise or t clause is permitted.
If no clause is satisfied, ecase signals an error with a
message constructed from the clauses. It is not permissible to continue
from this error. To supply an error message, the user should use
case with an otherwise clause containing a call to error.
The name of this function stands for ``exhaustive case'' or
``error-checking case.''
For example:
(setq x 1/3) (ecase x (alpha (foo)) (omega (bar)) ((zeta phi) (baz))) Error: The value of X, 1/3, is not ALPHA, OMEGA, ZETA, or PHI.
X3J13 voted in June 1988
(CONDITION-SYSTEM)
to adopt a proposal for a Common Lisp Condition System.
This proposal modifies the definition of ecase to specify its
interaction with the condition system.
See section 29.4.3.
[Macro]
ccase keyplace {({({key}*) | key} {form}*)}*
This control construct is similar to case,
but no explicit otherwise or t clause is permitted.
The keyplace must be a generalized variable reference
acceptable to setf. If no clause is satisfied, ccase signals an error
with a message constructed from the clauses. Continuing from this error
causes ccase to accept a new value from the user, store it into
keyplace, and start over, making the clause tests again. Subforms of
keyplace may be evaluated multiple times. The name of this function
stands for ``continuable exhaustive case.''
X3J13 voted in June 1988
(CONDITION-SYSTEM)
to adopt a proposal for a Common Lisp Condition System.
This proposal modifies the definition of ccase to specify its
interaction with the condition system.
See section 29.4.3.
X3J13 voted in March 1988 (PUSH-EVALUATION-ORDER)
to clarify order of evaluation (see section 7.2).
In addition, experience has shown that some Lisp programmers are too lazy to put an appropriate otherwise clause into every case statement to check for cases they didn't anticipate, even if they would agree that it will probably hurt them later. If an otherwise clause can be included very easily by adding one character to the name of the construct, it is perhaps more likely that programmers will take the trouble to do it.
The e versions do nothing more than supply automatically generated otherwise clauses, but correct implementation of the c versions requires some care. It is therefore especially important that the c versions be provided by the system so users don't have to puzzle them out on their own. Individual implementations may be able to do a better job of supporting these special forms, using their own idiosyncratic facilities, than can be done using the error-signaling facilities defined by Common Lisp.