• # Solution à base de types variants en ADA

    Posté par (site web personnel) . En réponse à la dépêche Sortie de GHC 8.0.2 et une petite histoire de typage statique. Évalué à 7.

    Par rapport à ton exemple, je pense qu'ADA propose également des solutions robustes du point de vu typage (et c'est un peu l'objectif de ce langage...).

    Le code

    WITH Ada.Text_IO;
    USE Ada.Text_IO;
    PROCEDURE Variant IS
     TYPE PolitiqueThreadCase IS
     (NombreFixe,
     NombreMaximumHardware,
     PasDeThreading,
     CasParticulier);
     TYPE PolitiqueThread (Politique : PolitiqueThreadCase := PasDeThreading) IS
     -- valeur par défaut obligatoire
     RECORD
     CASE Politique IS
     WHEN NombreFixe =>
     NombreThread : Positive; -- alias pour : Integer RANGE 1..Integer'Last
     WHEN OTHERS =>
     NULL;
     END CASE;
     END RECORD;
     PROCEDURE TestPolitique (Pol : IN PolitiqueThread) IS
     BEGIN
     CASE (Pol.Politique) IS
     WHEN NombreFixe =>
     Put_Line("Nombre fixé à" & Integer'Image(Pol.NombreThread));
     WHEN NombreMaximumHardware =>
     Put_Line("Fait chauffer la ferme de calcul");
     WHEN PasDeThreading =>
     Put_Line("Plutôt tranquille");
     WHEN CasParticulier =>
     Put_Line("Celui-ci je ne l'aime pas");
     END CASE;
     END TestPolitique;
     MaPolitique : PolitiqueThread;
    BEGIN
     TestPolitique(MaPolitique); -- Par défaut : PasDeThreading
     MaPolitique := (NombreFixe, 8);
     TestPolitique(MaPolitique);
     MaPolitique := (Politique => NombreMaximumHardware);
     TestPolitique(MaPolitique);
     MaPolitique := (Politique => CasParticulier);
     TestPolitique(MaPolitique);
     MaPolitique := (NombreFixe, 0); -- Warning: "Constraint Error will be raised at Runtime"
    EXCEPTION
     WHEN CONSTRAINT_ERROR =>
     Put_Line("n est trop bizarre...");
    END Variant;

    Le résultat

    Plutôt tranquille
    Nombre fixé à 8
    Fait chauffer la ferme de calcul
    Celui-ci je ne l'aime pas
    n est trop bizarre...
    

    Exceptions

    Donc, ça permet de gérer automatiquement le cas d'une valeur négative. Ada permet d'ajouter très simplement des tests au Runtime avec l'option RANGE. Très utile pour les tableaux également. Si l'on souhaite privilégier la performance, il est aussi possible de compiler en désactivant ces tests à l'exécution :

    pragma Suppress( Range_Check );

    On a droit également à une exception si on tente d'accéder ou de modifier un champ alors que le discriminant n'est pas le bon :

    MaPolitique := (Politique => CasParticulier);
    MaPolitique.NombreThread := 5; -- CONSTRAINT_ERROR : discriminant check failed

    La solution Ada est comme souvent un peu verbeuse, mais garde une bonne lisibilité.