Discussion:
Question sur les attributs.
(trop ancien pour répondre)
DrPi
2020-06-12 08:30:31 UTC
Permalink
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
2020-06-12 10:58:45 UTC
Permalink
Post by DrPi
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...
--
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
2020-06-12 13:00:34 UTC
Permalink
Post by J-P. Rosen
Post by DrPi
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 ?
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...
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
2020-06-20 18:20:58 UTC
Permalink
Post by J-P. Rosen
Post by DrPi
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 ?
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...
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
2020-06-21 06:00:06 UTC
Permalink
Post by DrPi
Post by J-P. Rosen
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
[...]
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.
--
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
2020-06-21 13:54:55 UTC
Permalink
Post by J-P. Rosen
Post by DrPi
Post by J-P. Rosen
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
[...]
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
2020-06-22 04:34:53 UTC
Permalink
Post by DrPi
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
--
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
2020-06-22 20:21:35 UTC
Permalink
Post by J-P. Rosen
Post by DrPi
Il y a une liste plus complète que celle-ci ?
https://en.wikibooks.org/wiki/Ada_Programming/Attributes
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
2021-04-19 01:50:24 UTC
Permalink
Post by DrPi
Post by J-P. Rosen
Post by DrPi
Il y a une liste plus complète que celle-ci ?
https://en.wikibooks.org/wiki/Ada_Programming/Attributes
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 ?
Post by DrPi
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
2021-04-19 23:21:30 UTC
Permalink
Post by J-P. Rosen
Post by DrPi
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 ?
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 ;-)
Post by J-P. Rosen
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 ?
Post by J-P. Rosen
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 ...
--
RAPID maintainer
http://savannah.nongnu.org/projects/rapid/
J-P. Rosen
2021-04-20 14:54:17 UTC
Permalink
Post by Thomas
Post by J-P. Rosen
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
Post by Thomas
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.
Post by Thomas
Post by J-P. Rosen
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...
http://www.ada-auth.org/standards/12rat/html/Rat12-0-4.html
http://www.ada-auth.org/standards/12rat/html/RCorr-0-2.html
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
Continuer la lecture sur narkive:
Loading...