Common Lisp the Language, 2nd Edition

Next: Method Selection and Up: Generic Functions and Previous: Congruent Lambda-Lists for

### 28.1.6.5. Keyword Arguments in 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 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