[ada-france] Notation objet préfixée en Ada 2005 (bis).

Pascal sur.pignard at wanadoo.fr
Lun 24 Déc 19:19:04 CET 2007


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





Plus d'informations sur la liste de diffusion Ada-France