Fonction générique

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 :

(defgeneric nom (params))

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 :

(defgeneric medium-gcontext (medium ink))

(defgeneric sheet-disown-child (sheet child &key errorp))

(defgeneric event-peek (client &optional event-type))

(defgeneric change-space-requirements (pane &rest rest))

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
2011-10-14