Question sur les attributs.

18 views
Skip to first unread message

DrPi

unread,
Jun 12, 2020, 4:30:33 AM6/12/20
to
Bonjour,

Si je définis un enum comme suit :
type t_couleurs is (Rouge, Vert, Bleu);
couleur : t_couleurs := Rouge;

Pour avoir la position, je dois écrire t_couleurs'pos(couleur)
Le compilateur sait que couleur est de type t_couleurs, alors pourquoi
je ne peux pas écrire couleur'pos ?

Nicolas

J-P. Rosen

unread,
Jun 12, 2020, 6:58:49 AM6/12/20
to
Réponse philosophique:
Le compilateur le sait, mais pas nécessairement le lecteur. En Ada, on
aime bien que tout soit explicite à la lecture, quitte à user un peu
plus les doigts de celui qui écrit. Un code est relu beaucoup plus
souvent qu'il n'est écrit...

Réponse technologique:
Il n'y a pas de miracle ni de magie en Ada, juste des déclarations et
des règles de visibilité. Quand on déclare le type t_couleurs, le
compilateur déclare automatiquement une fonction dont le nom est
t_couleurs'Pos. C'est cette fonction qui est appelée. Quelle déclaration
correspondrait à la syntaxe couleur'pos?

NB: Cette dernière explication est un peu "tong in cheek", car pour
l'attribut 'Image, cette syntaxe a été autorisée - suite à un grand
nombre de gens qui la réclamaient. Perso j'aime bien avoir un modèle
propre, mais bon, 'Image n'est censé être utilisé que pour debugger...

--
J-P. Rosen
Adalog
2 rue du Docteur Lombard, 92441 Issy-les-Moulineaux CEDEX
Tel: +33 1 45 29 21 52, Fax: +33 1 45 29 25 00
http://www.adalog.fr

DrPi

unread,
Jun 12, 2020, 9:00:38 AM6/12/20
to
Le 12/06/2020 à 12:58, J-P. Rosen a écrit :
> Le 12/06/2020 à 10:30, DrPi a écrit :
>
>> Si je définis un enum comme suit :
>> type t_couleurs is (Rouge, Vert, Bleu);
>> couleur : t_couleurs := Rouge;
>>
>> Pour avoir la position, je dois écrire t_couleurs'pos(couleur)
>> Le compilateur sait que couleur est de type t_couleurs, alors pourquoi
>> je ne peux pas écrire couleur'pos ?
>>
> Réponse philosophique:
> Le compilateur le sait, mais pas nécessairement le lecteur. En Ada, on
> aime bien que tout soit explicite à la lecture, quitte à user un peu
> plus les doigts de celui qui écrit. Un code est relu beaucoup plus
> souvent qu'il n'est écrit...
>
> Réponse technologique:
> Il n'y a pas de miracle ni de magie en Ada, juste des déclarations et
> des règles de visibilité. Quand on déclare le type t_couleurs, le
> compilateur déclare automatiquement une fonction dont le nom est
> t_couleurs'Pos. C'est cette fonction qui est appelée. Quelle déclaration
> correspondrait à la syntaxe couleur'pos?
>
> NB: Cette dernière explication est un peu "tong in cheek", car pour
> l'attribut 'Image, cette syntaxe a été autorisée - suite à un grand
> nombre de gens qui la réclamaient. Perso j'aime bien avoir un modèle
> propre, mais bon, 'Image n'est censé être utilisé que pour debugger...
>
Merci Jean-Pierre.

DrPi

unread,
Jun 20, 2020, 2:21:01 PM6/20/20
to
Le 12/06/2020 à 12:58, J-P. Rosen a écrit :
> Le 12/06/2020 à 10:30, DrPi a écrit :
>
>> Si je définis un enum comme suit :
>> type t_couleurs is (Rouge, Vert, Bleu);
>> couleur : t_couleurs := Rouge;
>>
>> Pour avoir la position, je dois écrire t_couleurs'pos(couleur)
>> Le compilateur sait que couleur est de type t_couleurs, alors pourquoi
>> je ne peux pas écrire couleur'pos ?
>>
> Réponse philosophique:
> Le compilateur le sait, mais pas nécessairement le lecteur. En Ada, on
> aime bien que tout soit explicite à la lecture, quitte à user un peu
> plus les doigts de celui qui écrit. Un code est relu beaucoup plus
> souvent qu'il n'est écrit...
>
> Réponse technologique:
> Il n'y a pas de miracle ni de magie en Ada, juste des déclarations et
> des règles de visibilité. Quand on déclare le type t_couleurs, le
> compilateur déclare automatiquement une fonction dont le nom est
> t_couleurs'Pos. C'est cette fonction qui est appelée. Quelle déclaration
> correspondrait à la syntaxe couleur'pos?
>
> NB: Cette dernière explication est un peu "tong in cheek", car pour
> l'attribut 'Image, cette syntaxe a été autorisée - suite à un grand
> nombre de gens qui la réclamaient. Perso j'aime bien avoir un modèle
> propre, mais bon, 'Image n'est censé être utilisé que pour debugger...
>

Il y a d'autres attributs qui s'utilisent avec les variables (ou les
types). Par exemple range, first et last :

declare
type t_ArrayInteger is array (-5 .. 35) of Integer;
ArrayInteger : t_ArrayInteger := (others => 0);
begin

for iter in ArrayInteger'Range loop
ArrayInteger(iter) := iter;
end loop;

for iter in ArrayInteger'First .. ArrayInteger'Last loop
ArrayInteger(iter) := iter;
end loop;

end;

De mon point de vue, heureusement que ces attributs s'utilisent avec les
variables sinon cela introduirait un risque d'erreur. Si le "range" de
la boucle for se faisait sur un type (ce qui est possible), celui-ci
serait décorrélé de la variable utilisée dans la boucle, le type n'étant
pas forcément celui de la variable.

Par exemple :
declare
type t_ArrayInteger is array (-5 .. 35) of Integer;
type t_ArrayInteger2 is array (-15 .. 35) of Integer;
ArrayInteger : t_ArrayInteger := (others => 0);
begin
for iter in t_ArrayInteger2'Range loop
ArrayInteger(iter) := iter;
end loop;
end;

Ca compile sans problème mais une exception est, bien évidemment, levée
lors de l'exécution.

Nicolas

J-P. Rosen

unread,
Jun 21, 2020, 2:00:08 AM6/21/20
to
Le 20/06/2020 à 20:20, DrPi a écrit :
>> NB: Cette dernière explication est un peu "tong in cheek", car pour
>> l'attribut 'Image, cette syntaxe a été autorisée - suite à un grand
>> nombre de gens qui la réclamaient. Perso j'aime bien avoir un modèle
>> propre, mais bon, 'Image n'est censé être utilisé que pour debugger...
>>
> Il y a d'autres attributs qui s'utilisent avec les variables (ou les
> types). Par exemple range, first et last :
[...]
Mon allusion ne portait pas sur le fait que l'attribut porte sur une
variable, mais sur le fait que ça ne correspond pas à un élément déclaré
par le compilateur. V'First est une constante déclarée par le
compilateur, V'Range est un sous-type déclaré par le compilateur, etc.

Mais V'Image "dénote un appel à T'Image(V)" (où T'Image est bel et bien
une fonction déclarée par le compilateur). Donc c'est moins élégant que
les autres.

DrPi

unread,
Jun 21, 2020, 9:54:56 AM6/21/20
to
Le 21/06/2020 à 08:00, J-P. Rosen a écrit :
> Le 20/06/2020 à 20:20, DrPi a écrit :
>>> NB: Cette dernière explication est un peu "tong in cheek", car pour
>>> l'attribut 'Image, cette syntaxe a été autorisée - suite à un grand
>>> nombre de gens qui la réclamaient. Perso j'aime bien avoir un modèle
>>> propre, mais bon, 'Image n'est censé être utilisé que pour debugger...
>>>
>> Il y a d'autres attributs qui s'utilisent avec les variables (ou les
>> types). Par exemple range, first et last :
> [...]
> Mon allusion ne portait pas sur le fait que l'attribut porte sur une
> variable, mais sur le fait que ça ne correspond pas à un élément déclaré
> par le compilateur. V'First est une constante déclarée par le
> compilateur, V'Range est un sous-type déclaré par le compilateur, etc.
>
> Mais V'Image "dénote un appel à T'Image(V)" (où T'Image est bel et bien
> une fonction déclarée par le compilateur). Donc c'est moins élégant que
> les autres.
>
Je commence à comprendre.
Si l'attribut est une fonction, il s'applique sur le type. Sinon, il
s'applique sur le type ou sur la variable elle-même.

Il y a une liste plus complète que celle-ci ?
https://en.wikibooks.org/wiki/Ada_Programming/Attributes

J-P. Rosen

unread,
Jun 22, 2020, 12:34:54 AM6/22/20
to
Le 21/06/2020 à 15:54, DrPi a écrit :
> Il y a une liste plus complète que celle-ci ?
> https://en.wikibooks.org/wiki/Ada_Programming/Attributes

Bien sûr:
http://www.ada-auth.org/standards/12rm/html/RM-K-2.html

DrPi

unread,
Jun 22, 2020, 4:21:36 PM6/22/20
to
Le 22/06/2020 à 06:34, J-P. Rosen a écrit :
> Le 21/06/2020 à 15:54, DrPi a écrit :
>> Il y a une liste plus complète que celle-ci ?
>> https://en.wikibooks.org/wiki/Ada_Programming/Attributes
>
> Bien sûr:
> http://www.ada-auth.org/standards/12rm/html/RM-K-2.html
>
Ok. J'ai un peu du mal à m'y retrouver dans la documentation de Ada.

Merci Jean-Pierre.

Thomas

unread,
Apr 18, 2021, 9:50:25 PMApr 18
to
In article <5ef112d0$0$9551$426a...@news.free.fr>, DrPi <3...@drpi.fr>
wrote:

> Le 22/06/2020 à 06:34, J-P. Rosen a écrit :
> > Le 21/06/2020 à 15:54, DrPi a écrit :
> >> Il y a une liste plus complète que celle-ci ?
> >> https://en.wikibooks.org/wiki/Ada_Programming/Attributes
> >
> > Bien sûr:
> > http://www.ada-auth.org/standards/12rm/html/RM-K-2.html

pourquoi lui donnes tu la version non consolidée ?

est ce que c'est parce que X'Image n'y est pas défini ?
il y a pourtant d'autres améliorations, tu ne considères quand même pas
que tout est à jeter ?


> Ok. J'ai un peu du mal à m'y retrouver dans la documentation de Ada.

les 2 grands points de départ sont :
http://www.ada-auth.org/standards/rm12_w_tc1/html/RM-TOC.html
http://www.ada-auth.org/standards/rm12_w_tc1/html/RM-0-5.html

il faut être un peu fin pour savoir où trouver ce qu'on cherche, quand
on n'a pas bcp d'expérience,
mais ça vaut le coup quand on trouve les réponses à ses questions, sans
attendre qu'un autre humain prenne le temps de les écrire ;-)

--
RAPID maintainer
http://savannah.nongnu.org/projects/rapid/

Thomas

unread,
Apr 19, 2021, 7:21:32 PMApr 19
to
In article <rbvn58$fte$1...@dont-email.me>, "J-P. Rosen" <ro...@adalog.fr>
wrote:

> Le 12/06/2020 à 10:30, DrPi a écrit :
>
> > Si je définis un enum comme suit :
> > type t_couleurs is (Rouge, Vert, Bleu);
> > couleur : t_couleurs := Rouge;
> >
> > Pour avoir la position, je dois écrire t_couleurs'pos(couleur)
> > Le compilateur sait que couleur est de type t_couleurs, alors pourquoi
> > je ne peux pas écrire couleur'pos ?
> >
> Réponse philosophique:
> Le compilateur le sait, mais pas nécessairement le lecteur. En Ada, on
> aime bien que tout soit explicite à la lecture, quitte à user un peu
> plus les doigts de celui qui écrit.

vive la génération de code ;-)


>
> Réponse technologique:
> Il n'y a pas de miracle ni de magie en Ada, juste des déclarations et
> des règles de visibilité. Quand on déclare le type t_couleurs, le
> compilateur déclare automatiquement une fonction dont le nom est
> t_couleurs'Pos. C'est cette fonction qui est appelée. Quelle déclaration
> correspondrait à la syntaxe couleur'pos?

(c'est pas clair mais heureusement t'as expliqué dans le msg suivant)

http://www.ada-auth.org/standards/rm12_w_tc1/html/RM-K-2.html

si je comprend bien,
"X'Image denotes the result of calling function S'Image"
n'a pas exactement la même signification que
"S'Image denotes a function with the following specification"
?

c'est pour ça qu'ici :
https://gcc.gnu.org/onlinedocs/gcc-10.3.0/gnat_rm/Attribute-Img.html
X'Img conserve son utilité en tant que fonction déclarée
automatiquement, qu'on peut manipuler comme une fonction déclarée
normalement,
alors qu'avec X'Image on ne peut pas ?


>
> NB: Cette dernière explication est un peu "tong in cheek", car pour
> l'attribut 'Image, cette syntaxe a été autorisée - suite à un grand
> nombre de gens qui la réclamaient. Perso j'aime bien avoir un modèle
> propre, mais bon, 'Image n'est censé être utilisé que pour debugger...


bizarre, je ne trouve rien dans aucune des 2 versions du Rationale :
http://www.ada-auth.org/standards/12rat/html/Rat12-0-4.html
http://www.ada-auth.org/standards/12rat/html/RCorr-0-2.html


ce que j'ai trouvé de plus proche est ici :
https://gcc.gnu.org/onlinedocs/gcc-9.3.0/gnat_rm/Attribute-Img.html

je ne vois pas énormément l'intérêt, alors (d'après ce que tu dis)
plutôt que de le reporter dans la norme, ils auraient mieux fait
d'ajouter un avertissement quand on s'en sert dans des conditions où les
"pragma Debug" ne sont pas activés ...

J-P. Rosen

unread,
Apr 20, 2021, 10:54:15 AMApr 20
to
Le 20/04/2021 à 01:21, Thomas a écrit :
> In article <rbvn58$fte$1...@dont-email.me>, "J-P. Rosen" <ro...@adalog.fr>

>> Réponse technologique:
>> Il n'y a pas de miracle ni de magie en Ada, juste des déclarations et
>> des règles de visibilité. Quand on déclare le type t_couleurs, le
>> compilateur déclare automatiquement une fonction dont le nom est
>> t_couleurs'Pos. C'est cette fonction qui est appelée. Quelle déclaration
>> correspondrait à la syntaxe couleur'pos?
>
> (c'est pas clair mais heureusement t'as expliqué dans le msg suivant)
>
> http://www.ada-auth.org/standards/rm12_w_tc1/html/RM-K-2.html
>
> si je comprend bien,
> "X'Image denotes the result of calling function S'Image"
> n'a pas exactement la même signification que
> "S'Image denotes a function with the following specification"
non, X'Image provoque l'appel de la fonction, et dénote le résultat.
S'Image est la fonction elle-même (il faut l'appeler), on peut très bien
par exemple la passer à une instanciation de générique

> c'est pour ça qu'ici :
> https://gcc.gnu.org/onlinedocs/gcc-10.3.0/gnat_rm/Attribute-Img.html
> X'Img conserve son utilité en tant que fonction déclarée
> automatiquement, qu'on peut manipuler comme une fonction déclarée
> normalement,
> alors qu'avec X'Image on ne peut pas ?
X'Img est une fonction sans paramètre, pas le résultat d'un appel.

>> NB: Cette dernière explication est un peu "tong in cheek", car pour
>> l'attribut 'Image, cette syntaxe a été autorisée - suite à un grand
>> nombre de gens qui la réclamaient. Perso j'aime bien avoir un modèle
>> propre, mais bon, 'Image n'est censé être utilisé que pour debugger...
>
>
> bizarre, je ne trouve rien dans aucune des 2 versions du Rationale :
> http://www.ada-auth.org/standards/12rat/html/Rat12-0-4.html
> http://www.ada-auth.org/standards/12rat/html/RCorr-0-2.html
>
>
> ce que j'ai trouvé de plus proche est ici :
> https://gcc.gnu.org/onlinedocs/gcc-9.3.0/gnat_rm/Attribute-Img.html
>
> je ne vois pas énormément l'intérêt, alors (d'après ce que tu dis)
> plutôt que de le reporter dans la norme, ils auraient mieux fait
> d'ajouter un avertissement quand on s'en sert dans des conditions où les
> "pragma Debug" ne sont pas activés ...
>
Rien n'interdit de l'utiliser partout, quand je dis que c'est pour le
debug, c'est une opinion personnelle.

En fait Text_IO est très bien fait, à condition de bien l'utiliser.
En particulier, il possède une particularité très intéressante:
si on prend une séquence qui écrit des données de types variés (via les
bonnes instantiations), il suffit de reprendre exactement le même code
et de remplacer tous les PUT par des GET, et on relira les données
correctement. Ca ne marche plus si on utilise des 'Image , en
particulier parce que si la longueur de ligne est limitée, les string
peuvent être repliées, alors que pour les autres données, on forcera un
New_Line pour être sûr qu'une donnée n'est jamais à cheval sur deux lignes.

--
J-P. Rosen
Adalog
2 rue du Docteur Lombard, 92441 Issy-les-Moulineaux CEDEX
Tel: +33 1 45 29 21 52
https://www.adalog.fr
Reply all
Reply to author
Forward
0 new messages