Notation objet préfixée en Ada 20 05 (bis).
Pascal <[email protected]>
| Newsgroups | gmane.comp.lang.ada.france |
|---|---|
| Message-ID | <[email protected]> |
Bonjour, petit problème Ada pour briller lors d'un repas de famille - quoique ;-) En parcourant et mettant en pratique un exemple du livre "Les langages à objets" (excellent bien qu'ancien - 1992, déjà) de Michel Beaudouin-Lafon, je me suis trouvé confronté à une question soulevée par la nouvelle notation objet préfixée d'Ada 2005. Voici l'exemple retranscrit en Ada : with Ada.Text_IO; use Ada.Text_IO; procedure Pile is subtype Entier is Integer; type tableau_entier is array (1..10) of Entier; package Pile is type Pile is tagged record pile : tableau_entier; sommet : Entier := 0; end record; procedure Empiler (P : in out Pile; Valeur : Entier); procedure Depiler (P : in out Pile); function Sommet (P : Pile) return Entier; end; package body Pile is procedure Empiler (P : in out Pile; Valeur : Entier) is begin P.sommet := P.sommet + 1; P.pile(P.sommet) := Valeur; end; procedure Depiler (P : in out Pile) is begin P.sommet := P.sommet - 1; end; function Sommet (P : Pile) return Entier is begin return P.pile(P.sommet); end; end; p : Pile.Pile; begin p.Empiler (15); Put_Line(p.Sommet'img); -- 1 ou 15 ? end Pile; Comme l'auteur j'ai volontairement nommé de façon identique des éléments de nature différentes. Ainsi, l'attribut Sommet du type Pile à le même nom que la primitive Sommet. Le premier dénote l'index le plus haut de la Pile, l'autre renvoie la valeur de la dernière valeur empilée. La question : qu'affiche le programme, en l'occurrence 1 (un seul élément empilé) valeur du champ sommet ou 15 (dernière valeur empilée) valeur de la fonction Sommet invoquée en notation préfixée d'Ada 2005 ? GNAT ne s'embarrasse pas de cette question. Il fait le choix pour nous sans erreur de compilation ni avertissement. $ gnatmake -gnatf pile gcc -c -gnatf pile.adb gnatbind -x pile.ali gnatlink pile.ali $ ./pile 1 Ce comportement est assez heureux car avec le choix inverse, le code de la fonction Sommet provoquerait un appel récursif infini! D'autre part, l'invocation du composant sommet ne peut se faire qu'avec cette notation "P.Sommet" alors que l'appel de la fonction peut se faire classiquement par "Pile.Sommet (P)", donc acte. Par contre, le texte du manuel au paragraphe "8.6 The Context of Overload Resolution" est assez nébuleux pour moi. Joyeuses fêtes de fin d'années, Pascal Pignard. http://blady.pagesperso-orange.fr _______________________________________________ Site WWW de l'association Ada-France: http://www.ada-france.org/ [email protected] http://www.ada-france.org/mailman/listinfo/ada-france