Une fonction générique est un objet Common Lisp dont l'usage est similaire à celui d'une fonction normale. Elle diffère d'une fonction normale car en principe son implémentation est répartie en morceaux appelés méthodes.
Les méthodes CLOS ne sont donc pas associées à des classes, mais à des fonctions génériques. Une telle fonction correspond exactement à une opération d'un protocole (voir section 15.4).
À une fonction générique correspond une signature (sous forme de lambda-liste) indiquant le nombre de paramètres ainsi que leur nature (obligatoire, facultatif, mot-clé, reste, etc). Chaque méthode doit avoir une signature congruente à celle de sa fonction générique.
La syntaxe de la définition d'une fonction générique est la suivante :
La lambda-liste autorisée pour la déclaration d'une fonction générique est légèrement différente (en fait plus simple) de celle autorisée pour une fonction normale. La lambda-liste commence par une suite (potentiellement vide) de paramètres obligatoires. Cette suite est éventuellement suivie du symbole &optional suivi d'une suite de paramètres facultatifs. Puis, figure éventuellement le symbole &rest suivi d'un paramètre reste. À la suite du paramètre reste, on peut avoir le symbole &key suivi d'une suite de paramètres mots-clés. Après cette liste, on peut trouver le symbole &allow-other-keys.
On n'a donc pas la possibilité de donner une valeur initiale à un paramètre facultatif ou à un paramètre mot-clé dans la lambda-liste d'une fonction générique. Voici quelques exemples tirés de McCLIM :
Il n'y a aucun corps associé à une fonction générique. Les expressions sont plutôt associées aux méthodes de la fonction générique.
Irene DURAND