CLOS

CLOS

Common Lisp Object System


WikiLettreMini.svg Cette page est considérée comme un article à approfondir.


Le Common Lisp Object System, souvent abrégé en CLOS (prononcé 'si-lauss'), est l'ensemble des primitives présentes dans le langage de programmation Common Lisp pour construire un programme orienté objet. Il existe également une version de CLOS pour le langage Scheme, nommée TinyClos.

Sommaire

Présentation

CLOS est un système objet à classes (il existe des systèmes à prototypes). Il descend de flavors et common loops, développés dans les années 1980. Common Lisp a été le premier langage à objet standardisé par l'ANSI, en 1995, précédant de peu SmallTalk.

Les objets et Lisp

D'un certain point de vue, Lisp est un langage orienté objet depuis le début : les structures de données manipulées ont une identité et sont réflexives. La seule chose qui lui manquait pour recevoir l'estampille orienté objet, est la capacité d'étendre le système de types de Lisp.

Caractéristiques

CLOS est construit autour de deux axes : les classes et les fonctions génériques.

Les classes de CLOS sont relativement similaires à celles des autres langages à objet. Ce sont des groups d'attributs. La spécialisation par héritage multiple est permise. Il est possible de définir des accesseurs et des mutateurs particuliers pour chaque attribut.

Contrairement à la plupart des systèmes à objets classiques, les méthodes ne sont pas définies dans l'espace de nom des classes. Elles appartiennent à des fonctions génériques, qui sont des objets distincts. Cela permet de réduire le couplage a priori entre types de données et opérations sur ces types. Cela autorise naturellement l'extension de la sélection dynamique de méthode à l'ensemble des arguments obligatoires, et non pas au premier paramètre privilégié (appelé généralement le 'receveur' de l'appel de méthode). Expliquons ces deux points.

Fonctions génériques

Des classes 'conteneurs' peuvent être définies dans des bibliothèques ou des frameworks indépendants, et cependant, certains concepts génériques s'appliquent à toutes ces classes : nombre d'éléments, représentation sérialisée pour en prendre deux. Ces concepts génériques sont, dans des langages comme Java ou C++, obligatoirement fournis par héritage (interface en Java, mixin en C++), pour satisfaire le système de types statique. Si les concepteurs ont oublié de fournir une interface pour une telle fonctionnalité générique, il n'y a rien à faire (en pratique, on doit contourner le problème par des procédés alourdissant le code, par exemple écrire ses propres sous-classes du framework disposant de la fonctionnalité voulue, mais ce n'est pas toujours possible). Des langages dynamiques comme Python, permettent le 'monkey-patching', c'est-à-dire l'ajout post-hoc de méthodes à des classes existantes; mais c'est une pratique découragée et posant des problèmes de maintenabilité.

La solution de CLOS à ce problème est la notion de fonction générique indépendante du site de définition et de l'espace de nom d'une classe associée. Ainsi on peut définir une fonction 'nb-elements' disposant d'implémentations (méthodes) variées pour des classes de provenances diverses sans avoir à toucher à la définition même de ces classes.

Sélection multiple

Puisque les méthodes sont groupées dans des fonctions génériques, il n'y a aucune raison de considérer que le premier argument est 'privilégié' (comme le 'self' ou 'this' d'autres langages à objets). On peut admettre des définitions de méthodes pour le tuple des types des arguments obligatoires.

Exemple avec des types numériques. L'opération d'addition, 'add' pourrait être définie classiquement comme ceci (en pseudo-code) :

class int:
    defmethod add(self, y):
        if isinstance(y, int):
            ...
        elif isinstance(y, float):
            ...

Avec juste deux types numériques int et float, il faut donc définir deux classes (int, float) et deux méthodes. De plus, chaque méthode contient un test de type sur le second argument. Cela pose un problème d'extensibilité. Si l'on veut ajouter de nouvelles méthodes, il faut disposer du source original. Si l'on veut ajouter de nouveaux types numériques (rationnels, complexes ou autres), nous ne pouvons facilement étendre les méthodes existantes (sans, à nouveau, accéder au source et ajouter des branches aux tests de types).

En dissociant classes et méthodes, on se permet donc d'ajouter après coup autant de classes que nécessaires, de définir des méthodes non prévues initialement, et finalement de fournir de nouvelles implémentations de méthodes (fonctions génériques en fait) après coup, de façon non intrusive.

class int: ...
class float: ...
defmethod add(x: int, y: int): ...
defmethod add(x: int, y: float): ...
defmethod add(x: float, y: int): ...
defmethod add(x: float, y: float): ...

Et après coup:

defmethod product(x: int, y: int): ...

(bien entendu il faut produire l'ensemble des combinaisons pertinentes pour le domaine d'application),

class rational: ...
defmethod add(x: int, y: rational): ...
  • Portail de la programmation informatique Portail de la programmation informatique
Ce document provient de « Common Lisp Object System ».

Wikimedia Foundation. 2010.

Contenu soumis à la licence CC-BY-SA. Source : Article CLOS de Wikipédia en français (auteurs)

Игры ⚽ Нужно решить контрольную?

Regardez d'autres dictionnaires:

  • clos — clos, close 1. (klô, klô z ) part. passé de clore. 1°   Fermé. Jardin clos de murailles. •   Bien semble être la mer une barre assez forte Pour nous ôter l espoir qu il puisse être battu ; Mais est il rien de clos dont ne trouve la porte Ton heur …   Dictionnaire de la Langue Française d'Émile Littré

  • CLOS — es el acrónimo inglés de Common Lisp Object System y es una extensión de ANSI Common Lisp para permitir la programación orientada a objetos que ha sido adoptada por otros dialectos de Lisp como EuLisp o Emacs Lisp.[1] Inicialmente fue propuesta… …   Wikipedia Español

  • clos — clos; clos·a·ble; clos·en; clos·ish; clos·te·ri·um; clos·trid·i·al; clos·trid·i·um; cy·clos·to·mate; cy·clos·to·mes; cy·clos·to·mi; cy·clos·to·mous; en·clos·er; fore·clos·able; re·clos·able; clos·et; clos·ing; cy·clos·to·ma; clos·trid·i·an;… …   English syllables

  • cloş — CLOŞ, cloşuri, s.n. Croială largă, în formă de clopot, cu falduri ori evazată, cu firele ţesăturii aşezate oblic. ♢ (Adjectival) Rochie cloş. – Din fr. cloche. Trimis de hai, 03.06.2004. Sursa: DEX 98  cloş s. n., pl. clóşuri Trimis de siveco,… …   Dicționar Român

  • CLOS — (англ. Common Lisp Object System  «объектная система Common Lisp’а»)  система объектно ориентированного программирования, являющаяся частью Common Lisp  стандарта языка Лисп. Кроме того, её встраивают в другие диалекты, такие… …   Википедия

  • Clos — may refer to one of the following. People Corinne Clos (born 1978), an Italian ski mountaineer and long distance runner Dani Clos (born 1988), a Spanish racing driver Dominique Clos (1821 1908), a French botanist Paco Clos (born 1960), a former… …   Wikipedia

  • Clos — bezeichnet: Clos (Weinberg), französisch für einen umfriedeten Weinberg Dani Clos (* 1988), spanischer Rennfahrer Dominique Clos (1821–1908), französischer Botaniker und Direktor des botanischen Gartens in Toulouse Joan Clos (* 1949), spanischer… …   Deutsch Wikipedia

  • clos — CLOS. s. m. Espace de terre cultivé et fermé de murailles, de haies, de fossés, etc. Un clos de vingt arpens. Clos de vigne. Clos d arbres fruitiers. Faire un clos …   Dictionnaire de l'Académie Française 1798

  • Clos Bb — (Сен Сир сюр Мер,Франция) Категория отеля: Адрес: 563 Chemin du Jas De David, 83270 Сен Сир …   Каталог отелей

  • Clos —   [kloː] das, / , in einigen französischen und schweizerischen Weinbaugebieten Bezeichnung für eine Einzellage; ursprünglich ein mit einer Mauer umgebener Weinberg. * * * Clos [klo:, frz.: klo], das; [klo:(s)], [klo:s; frz. clos, eigtl. =… …   Universal-Lexikon

  • Clos — [klo:] das; [klo:(s)], [klo:s] <aus fr. clos »Gehege«, dies zu (m)lat. clausum »Geschlossenes«, substantiviertes Part. Perf. (Neutr.) von lat. claudere »schließen«> von einer Mauer od. Hecke eingefriedeter Weinberg od. garten in Frankreich …   Das große Fremdwörterbuch

Share the article and excerpts

Direct link
Do a right-click on the link above
and select “Copy Link”