I’ll discuss the syntax of **DEFGENERIC** in the next section; for now just note that this definition doesn’t contain any actual code.

    Methods indicate what kinds of arguments they can handle by specializing the required parameters defined by the generic function. For instance, on the generic function draw, you might define one method that specializes the shape parameter for objects that are instances of the class circle while another method specializes shape for objects that are instances of the class triangle. They would look like this, eliding the actual drawing code:

    1. ...)

    You can specialize a parameter in two ways—usually you’ll specify a class that the argument must be an instance of. Because instances of a class are also considered instances of that class’s superclasses, a method with a parameter specialized on a particular class can be applicable whenever the corresponding argument is a direct instance of the specializing class or of any of its subclasses. The other kind of specializer is a so-called **EQL** specializer, which specifies a particular object to which the method applies.

    However, reversing the order of lookup opens up possibilities not found in message-passing systems. Generic functions support methods that specialize on multiple parameters, provide a framework that makes multiple inheritance much more manageable, and let you use declarative constructs to control how methods are combined into an effective method, supporting several common usage patterns without a lot of boilerplate code. I’ll discuss those topics in a moment. But first you need to look at the basics of the two macros used to define the generic functions **DEFGENERIC** and .