Paquetage générique de gestion d'une liste de symboles

      spécification du paquetage générique liste_symbole

generic
 type T is private;
package liste_symbole is
 liste_vide:exception;
 type Liste is private;
 function estVide(l:Liste) return Boolean;
 function vide return Liste;
 procedure insererEnQueue(e:in T;l:in out Liste); -- insertion de l'élément e en queue de liste
 procedure extraire(l:in out Liste;e:out T); -- l'élément e extrait de la liste est l'élément de tête
private
 type Cellule;
 type Liste is access Cellule;
 type Cellule is
  record
   valeur:T;
   suivant:Liste;
  end record;
end liste_symbole;
 

      corps du paquetage générique liste_symbole

with Ada.Text_io;use Ada.Text_io;

package body liste_symbole is
 function estVide(l:Liste) return Boolean is
 begin
  return l=NULL;
 end estVide;

 function vide return Liste is
 begin
  return NULL;
 end vide;

 procedure insererEnQueue(e:in T;l:in out Liste) is
  curseur:Liste:=l;
 begin
  if estVide(l) then l:=new Cellule'(e,NULL);
  else
   loop
   exit when curseur.suivant=NULL;
    curseur:=curseur.suivant;
   end loop;
   curseur.suivant:=new Cellule'(e,NULL);
  end if;
 end insererEnQueue;

 procedure extraire(l:in out Liste;e:out T) is
 begin
  if estVide(l) then raise liste_vide;
  else
   e:=l.valeur;
   l:=l.suivant;
  end if;
 exception
  when liste_vide =>
   put_line(" liste vide : impossible d'extraire un élément !");
 end extraire;
end liste_symbole;