Sélection

Étant donnés une fonction générique avec ses méthodes et un appel à celle-ci, quelles sont les méthodes qui doivent être invoquées et dans quel ordre les utiliser? C'est le rôle du mécanisme de sélection. Nous présenterons uniquement le comportement par défaut de CLOS mais il faut savoir que ce comportement peut être modifié par le programmeur. Nous présenterons la sémantique de la sélection, c'est-à-dire l'effet visible par le programmeur et non le comportement exact sous-jacent. La différence entre les deux est que le comportement exact est en général plus efficace grâce à diverses optimisations d'implémentation.

La première phase de la sélection consiste à déterminer les méthodes applicables. Une méthode est applicable si et seulement si les arguments correspondant à un paramètre spécialisé par une classe sont instances de ces classes et si les arguments correspondant à un paramètre spécialisé par un objet sont égaux à ces objets.

Toutes les méthodes primaires sont ensuite triées par spécificité. Une méthode $A$ est plus spécifique qu'une méthode $B$ si les classes utilisées pour la spécialisation dans $A$ sont des sous-classes de celles utilisées pour la spécialisation dans $B$. La règle exacte utilisée est compliquée, car elle détermine un ordre total même si deux classes ne sont pas apparentées par héritage. Chaque catégorie de méthodes (primaires, :before, :around, :after) est triée séparément.

Finalement, la méthode effective est appelée. Cette méthode est une combinaison des autres. Elle est calculée comme ceci :

Dans le premier cas, la méthode :around la plus spécifique peut appeler la méthode suivante dans l'ordre avec (call-next-method). Quand la liste triée de méthodes :around est épuisée, la première méthode :before sera appelée et ainsi de suite.

La méthode primaire la plus spécifique peut aussi se servir de (call-next-method) afin d'appeler la méthode primaire suivante dans l'ordre.

La valeur renvoyée par l'appel est la valeur de la méthode :around la plus spécifique si elle existe. Sinon, c'est la valeur de la méthode primaire la plus spécifique.

La sélection est faite sur l'ensemble des arguments. On parle de sélection multiple.

Irene DURAND
2011-10-14