OVH Cloud OVH Cloud

Emuler le "new type" et "subtype" de Ada

13 réponses
Avatar
Marc Boyer
Dans mes réflexions sur les langages, j'étais en train de
me dire qu'en C++, les type de base finissent pas être
les parents pauvres du système de type. En fait, je pensais
à la possibilité dans d'autre langage de définir un type
qui "hérite" de int par exemple.

// Pseudo syntaxe
// Les types
type kilo = subtype int;
type longueur = subtype int;
// Declaration
kilo monPoids, ton Poid;
longueur maTaille, taTaille;
// Utilisation
monPoids= 75;
tonPoids= monPoids - 10;
maTaille= 180;
monPoids= maTaille; // Erreur de compilation
monPoids= (int) maTaille; // OK

En fait, on pourrait faire ça en C++ si int était une classe.
Mais ça ne l'est pas...

J'ai une piste de solution. Je sais faire une classe Integer
(graçe à des discussion sur fclc++ d'ailleurs) qui se comporte
quasiment comme un entier. Le seul problème que j'ai, c'est
que pour éviter les ambiguités, je n'offre pas de conversion
implicite vers int (sinon, il ne sait jamais si monPoids+1
est de type int ou kilo), mais juste une fonction "toInt".

Mon principal problème, c'est l'usage des valeurs entières
comme indice de tableau.

Je dois pouvoir ecrire une fonction template qui gère les
tableaux "build-in" avec un truc du genre
template<typename T, int N>
T operator[](T (&array)[N], Integer i){
return (&array)[i.toInt()];
}

On doit pouvoir gérer les std::vector tout pareil, et on couvre
les cas de base.

Mais, si quelqu'un écrit une fonction qui prend un int en paramêtre,
je ne peux pas lui passer un Integer...


Une idée ?

Marc Boyer
--
Lying for having sex or lying for making war? Trust US presidents :-(

10 réponses

1 2
Avatar
Michel Michaud
Dans news:brckt5$fve$, Marc
Dans mes réflexions sur les langages, j'étais en train de
me dire qu'en C++, les type de base finissent pas être
les parents pauvres du système de type. En fait, je pensais
à la possibilité dans d'autre langage de définir un type
qui "hérite" de int par exemple.

// Pseudo syntaxe
// Les types
type kilo = subtype int;
type longueur = subtype int;
// Declaration
kilo monPoids, ton Poid;
longueur maTaille, taTaille;
// Utilisation
monPoids= 75;
tonPoids= monPoids - 10;
maTaille= 180;
monPoids= maTaille; // Erreur de compilation


La seule chose que typedef ne fait pas...

monPoids= (int) maTaille; // OK


Ton exemple montre seulement quelque chose que tu pourrais
(presque ) faire avec typedef ou #define... Et il me semble
que ce tu veux est assez confus :

[...]

Mais, si quelqu'un écrit une fonction qui prend un int en paramêtre,
je ne peux pas lui passer un Integer...


Il faut que tu te décides : ou bien, tu veux un type qui est comme
int (donc conversion automatique) ou alors tu n'en veux pas. Peut-
être est-ce moi qui lit mal...

--
Michel Michaud
http://www.gdzid.com
FAQ de fr.comp.lang.c++ :
http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ/

Avatar
Jean-Marc Bourguet
Marc Boyer writes:

Dans mes réflexions sur les langages, j'étais en train de me dire
qu'en C++, les type de base finissent pas être les parents pauvres
du système de type. En fait, je pensais à la possibilité dans
d'autre langage de définir un type qui "hérite" de int par exemple.


Il y a au moins une personne qui essaie d'avoir le temps de rediger
une proposition. Quand on definit ainsi un "type derive", le probleme
est de savoir quelles sont les operations qui sont heritees (les
operations primitives d'Ada) et d'arriver a formuler des regles en
restant homogene avec le reste de C++.

--
Jean-Marc
FAQ de fclc++: http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ
C++ FAQ Lite en VF: http://www.ifrance.com/jlecomte/c++/c++-faq-lite/index.html
Site de usenet-fr: http://www.usenet-fr.news.eu.org

Avatar
Marc Boyer
Michel Michaud wrote:
Dans news:brckt5$fve$, Marc
monPoids= (int) maTaille; // OK


Ton exemple montre seulement quelque chose que tu pourrais
(presque ) faire avec typedef ou #define... Et il me semble
que ce tu veux est assez confus :


Disons que ce que je veux est assez simple si on connait
Ada ou SDL, mais je suis pas forcément clair en le disant.
Si tu veux, ça permet de définir des kilo de pomme,
de poire, mais de ne pas pouvoir les additionner.

Mais, si quelqu'un écrit une fonction qui prend un int en paramêtre,
je ne peux pas lui passer un Integer...


Il faut que tu te décides : ou bien, tu veux un type qui est comme
int (donc conversion automatique) ou alors tu n'en veux pas. Peut-
être est-ce moi qui lit mal...


En fait, mais j'avance dans ma réflxion, je veux un type X qui
1) se convertisse implicitement en int
2) dont on puisse hériter
3) tel que avec
class KiloPomme: public X {};
class KiloOrange: public X {};
KiloPomme p(0);
KiloOrange o(0);
il me faudrait que l'expression
p+1
soit de type KiloPomme, et soit une expression non ambigue,
et que
p+o
ne compile pas
4) si en plus on pouvait avoir que
X x(0);
x+p
soit non ambigue et de type X, ce serait bien.


Ceci dit, c'est plus à titre d'exercice qu'autre chose,
il y a pas d'urgence.


Merci de tes remarques


--
Lying for having sex or lying for making war? Trust US presidents :-(


Avatar
Marc Boyer
Jean-Marc Bourguet wrote:
Marc Boyer writes:

Dans mes réflexions sur les langages, j'étais en train de me dire
qu'en C++, les type de base finissent pas être les parents pauvres
du système de type. En fait, je pensais à la possibilité dans
d'autre langage de définir un type qui "hérite" de int par exemple.


Il y a au moins une personne qui essaie d'avoir le temps de rediger
une proposition. Quand on definit ainsi un "type derive", le probleme
est de savoir quelles sont les operations qui sont heritees (les
operations primitives d'Ada) et d'arriver a formuler des regles en
restant homogene avec le reste de C++.


Je suppose que c'est donc qu'il a échoué à le faire à l'intérieur
du langage tel qu'il est actuellement et que ma recherche est donc vaine.

Marc Boyer
--
Lying for having sex or lying for making war? Trust US presidents :-(


Avatar
Michel Michaud
Dans news:brkjq7$1d1$, Marc
Disons que ce que je veux est assez simple si on connait
Ada ou SDL, mais je suis pas forcément clair en le disant.
Si tu veux, ça permet de définir des kilo de pomme,
de poire, mais de ne pas pouvoir les additionner.


Je comprends bien ça...

[...]
En fait, mais j'avance dans ma réflxion, je veux un type X qui
1) se convertisse implicitement en int
2) dont on puisse hériter
3) tel que avec
class KiloPomme: public X {};
class KiloOrange: public X {};
KiloPomme p(0);
KiloOrange o(0);
il me faudrait que l'expression
p+1
soit de type KiloPomme, et soit une expression non ambigue,
et que
p+o
ne compile pas
4) si en plus on pouvait avoir que
X x(0);
x+p
soit non ambigue et de type X, ce serait bien.


Je crois qu'on peut presque y arriver, mais pas complètement.
Si on a la conversion implicite, on aura la possibilité de
faire les opérations sur int dans les expressions de type mixte.

Par ailleurs, je ne suis pas certain qu'il y a un intérêt réel.
Ou plutôt je pense que ce serait très complexe d'avoir un
mécanisme simple pour faire ce que tu demandes (il me semble
que ce n'est justement pas si simple en Ada quand il s'agit de
faire exactement ce qu'on veut). Prends ce point de vue par
exemple : moi, j'aimerais pouvoir additionner les KiloPomme
et KiloOrange, le total est utile si je veux pouvoir transporter
les deux à la fois. Alors ce serait quoi le type du résultat et
comment je fais pour dire ce que je veux ou pas dans ce genre de
cas ? Surtout que ce que je veux peut être différent de ce que
toi tu veux, alors qu'on veut utiliser le même type. Je me
rappelle très bien que l'histoire des sous-types (genre MIN..MAX)
de Pascal, ça semblait joli, mais ça finissait par ne plus
fonctionner adéquatement... Il me semble que ce que tu veux
entre un peu dans la même catégorie. Non ?

--
Michel Michaud
http://www.gdzid.com
FAQ de fr.comp.lang.c++ :
http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ/

Avatar
Marc Boyer
Michel Michaud wrote:
Dans news:brkjq7$1d1$, Marc
Disons que ce que je veux est assez simple si on connait
Ada ou SDL, mais je suis pas forcément clair en le disant.
Si tu veux, ça permet de définir des kilo de pomme,
de poire, mais de ne pas pouvoir les additionner.
[SNIP, liste des besoins]



Je crois qu'on peut presque y arriver, mais pas complètement.


J'arrive a faire 2-3 chose, mais je bute sur le constructeur,
même explicite.

Si on a la conversion implicite, on aura la possibilité de
faire les opérations sur int dans les expressions de type mixte.

Par ailleurs, je ne suis pas certain qu'il y a un intérêt réel.
Ou plutôt je pense que ce serait très complexe d'avoir un
mécanisme simple pour faire ce que tu demandes (il me semble
que ce n'est justement pas si simple en Ada quand il s'agit de
faire exactement ce qu'on veut). Prends ce point de vue par
exemple : moi, j'aimerais pouvoir additionner les KiloPomme
et KiloOrange, le total est utile si je veux pouvoir transporter
les deux à la fois. Alors ce serait quoi le type du résultat et
comment je fais pour dire ce que je veux ou pas dans ce genre de
cas ?


class Kilo: public Integer {};
class KiloPomme: public Kilo {};
class KiloOrange: public Kilo {};
Kilo k;
KiloPomme p(5);
KiloOrange o(4);
k= p+o;

Ou, si on arrive pas a faire toutes les jolies conversions:

k= (Kilo)p+(Kilo)o;

Surtout que ce que je veux peut être différent de ce que
toi tu veux, alors qu'on veut utiliser le même type. Je me
rappelle très bien que l'histoire des sous-types (genre MIN..MAX)
de Pascal, ça semblait joli, mais ça finissait par ne plus
fonctionner adéquatement... Il me semble que ce que tu veux
entre un peu dans la même catégorie. Non ?


Sauf qu'Ada a été pensé après les échecs de Pascal.
En C++, on a plein de cast, je vois pas pourquoi on les utiliserait
pas dans ce cas.
Ca demande juste que l'utilisateur dise explicitement quand
il veut faire des conversions.

Marc Boyer
--
Lying for having sex or lying for making war? Trust US presidents :-(


Avatar
Alain Naigeon
"Michel Michaud" a écrit dans le message news:
Q4lDb.8180$

exemple : moi, j'aimerais pouvoir additionner les KiloPomme
et KiloOrange, le total est utile si je veux pouvoir transporter
les deux à la fois. Alors ce serait quoi le type du résultat et
comment je fais pour dire ce que je veux ou pas dans ce genre de
cas ? Surtout que ce que je veux peut être différent de ce que
toi tu veux, alors qu'on veut utiliser le même type.


Ben oui, là on va trop loin, que ce soit pour un physicien,
ou même un philosophe (à supposer que ce dernier ait
assimilé l'addition) : dans ton cas, personne ni aucun
compilo ne peut deviner que tu veux additionner
masse(pommes) + masse (oranges)
alors que tu aurais pu aussi choisir les diamètres (pour
les ranger dans une boîte), ou les capacités calorifiques
(pour les mettre au frigo), etc.
Le problème d'une conversion * implicite *, c'est qu'elle
doit être unique, et bien rares sont les objets dont une
propriété est aussi dominante par rapport à toutes les
autres, AMHA.

--

Français *==> "Musique renaissance" <==* English
midi - facsimiles - ligatures - mensuration
http://anaigeon.free.fr | http://www.medieval.org/emfaq/anaigeon/
Alain Naigeon - - Strasbourg, France

Avatar
Jean-Marc Bourguet
Marc Boyer writes:

En fait, mais j'avance dans ma réflxion, je veux un type X qui
1) se convertisse implicitement en int
2) dont on puisse hériter
3) tel que avec
class KiloPomme: public X {};
class KiloOrange: public X {};
KiloPomme p(0);
KiloOrange o(0);
il me faudrait que l'expression
p+1
soit de type KiloPomme, et soit une expression non ambigue,
et que
p+o
ne compile pas
4) si en plus on pouvait avoir que
X x(0);
x+p
soit non ambigue et de type X, ce serait bien.


Pour info, en Ada tu n'as pas le 4).

A+

--
Jean-Marc
FAQ de fclc++: http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ
C++ FAQ Lite en VF: http://www.ifrance.com/jlecomte/c++/c++-faq-lite/index.html
Site de usenet-fr: http://www.usenet-fr.news.eu.org

Avatar
Jean-Marc Bourguet
Marc Boyer writes:

Jean-Marc Bourguet wrote:
Marc Boyer writes:

Dans mes réflexions sur les langages, j'étais en train de me dire
qu'en C++, les type de base finissent pas être les parents pauvres
du système de type. En fait, je pensais à la possibilité dans
d'autre langage de définir un type qui "hérite" de int par exemple.


Il y a au moins une personne qui essaie d'avoir le temps de rediger
une proposition. Quand on definit ainsi un "type derive", le probleme
est de savoir quelles sont les operations qui sont heritees (les
operations primitives d'Ada) et d'arriver a formuler des regles en
restant homogene avec le reste de C++.


Je suppose que c'est donc qu'il a échoué à le faire à l'intérieur
du langage tel qu'il est actuellement et que ma recherche est donc vaine.


C'est dans un cadre plus large qui effectivement est impossible a
l'interieur du langage existant. Ce qui t'interesse est peut-etre
possible, j'ai pas essaye.

--
Jean-Marc
FAQ de fclc++: http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ
C++ FAQ Lite en VF: http://www.ifrance.com/jlecomte/c++/c++-faq-lite/index.html
Site de usenet-fr: http://www.usenet-fr.news.eu.org



Avatar
Marc Boyer
Jean-Marc Bourguet wrote:
Marc Boyer writes:

4) si en plus on pouvait avoir que
X x(0);
x+p
soit non ambigue et de type X, ce serait bien.


Pour info, en Ada tu n'as pas le 4).


Faudrait vraiment que je me remette à Ada.
Je mets ça dans la TO DO list.

Marc Boyer
--
Lying for having sex or lying for making war? Trust US presidents :-(


1 2