Next: Method Selection and Combination, Previous: Congruent Lambda-lists for all Methods of a Generic Function, Up: Generic Functions and Methods
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 should be signaled; see Section 3.5 (Error Checking in Function Calls).
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 should 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 should 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)