defmethod

Die Funktion defmethod erzeugt Methoden (siehe Methode). Sie wertet ihre vier Argumente nicht aus. Beim ersten Argument handelt es sich um den Namen (ein Symbol) der generischen Funktion, in die die zu erzeugende Methode eingefügt werden soll. Das zweite Argument ist eine eventuell leere Liste mit den spezialisierten Parametern. Dann folgt ein Guard und der Rumpf der Methode.

Bei einem spezialisierten Parameter handelt es sich entweder um ein Symbol (dann ist der Parameter nicht spezialisiert) oder um eine Liste aus zwei Symbolen. Dann gibt das erste Symbol den Namen des Parameters an und das zweite den Namen einer Klasse oder eines Merkmals (siehe Merkmal). Die Methode wird in diesem Fall nur dann für einen Aufruf in Betracht gezogen, wenn für diesen Parameter ein Argument übergeben wird, das eine Instanz einer kompatiblen Klasse ist.

Wenn für Argumente mehrere Methoden anwendbar sind, dann wird die spezifischste Methode aufgerufen (siehe call-next-method).

Ein Aufruf von defmethod erzeugt die gewünschte Methode und bindet sie in die generische Funktion des angegebenen Namens ein. Wenn noch keine generische Funktion vorhanden ist, dann wird sie erzeugt. Es wird eine Ausnahme geworfen, wenn der Name bereits an einen Wert ungleich nil gebunden ist, der keine generische Funktion und keine Funktion ist.

Es wird auch eine Ausnahme geworfen, wenn die Methode mit einer bereits definierten Methode in Konflikt geraten würde (siehe Merkmal).

Im Unterschied zu Common Lisp dürfen die an einer generischen Funktion beteiligten Methoden verschiedene Zahlen von Parametern haben.

> (defmethod plus (a b) (and (number? a) (number? b)) (+ a b))
> (defmethod plus (a b) (and (string? a) (string? b)) (concatenate a b))
> (plus 7 3)
10

> (plus "hallo" " welt")
"hallo welt"