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
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.