Common Lisp the Language, 2nd Edition
Next: Method Selection and
Up: Generic Functions and
Previous: Congruent Lambda-Lists
for
When a generic function or any of its methods mentions
&key
in a lambda-list, the specific set of keyword
arguments accepted by the generic function varies according to the
applicable methods. The set of keyword arguments accepted by the generic
function for a particular call is the union of the keyword arguments
accepted by all applicable methods and the keyword arguments mentioned
after &key
in the generic function definition, if any.
A method that has &rest
but not &key
does not affect the set of acceptable keyword arguments. If the
lambda-list of any applicable method or of the generic function
definition contains &allow-other-keys
, all keyword
arguments are accepted by the generic function.
The lambda-list congruence rules require that each method accept all
of the keyword arguments mentioned after &key
in the
generic function definition, by accepting them explicitly, by specifying
&allow-other-keys
, or by specifying
&rest
but not &key
. Each method can
accept additional keyword arguments of its own, in addition to the
keyword arguments mentioned in the generic function definition.
If a generic function is passed a keyword argument that no applicable method accepts, an error is signaled.
For example, suppose there are two methods defined for
width
as follows:
(defmethod width ((c character-class) &key font) ...)
(defmethod width ((p picture-class) &key pixel-size) ...)
Assume that there are no other methods and no generic function
definition for width
. The evaluation of the following form
will signal an error because the keyword argument
:pixel-size
is not accepted by the applicable method.
(width (make-instance 'character-class :char #\Q)
:font 'baskerville :pixel-size 10)
The evaluation of the following form will signal an error.
(width (make-instance 'picture-class :glyph (glyph #\Q))
:font 'baskerville :pixel-size 10)
The evaluation of the following form will not signal an error if the
class named character-picture-class
is a subclass of both
picture-class
and character-class
.
(width (make-instance 'character-picture-class :char #\Q)
:font 'baskerville :pixel-size 10)
Next: Method Selection and
Up: Generic Functions and
Previous: Congruent Lambda-Lists
for
AI.Repository@cs.cmu.edu