J'ai essayé de comprendre ces fameux concepts en c++ : en gros une méthode peut travailler avec n'importe quel type compatible, mais en plus, on peut spécifier des contraintes.
En Lisaac, on a essayé de mettre en place une évol permettant de faire tout ce qu'on peut faire avec les templates, sachant que le langage possède à la base la généricité au niveau de l'objet. ARRAY(E)
La nouvelle fonctionalité de la prochaine version du compilo, consiste à permettre de définir des générique au niveau de la méthode.
Je l'ai voulu, car je voulais pouvoir faire ça, dans l'objet ARRAY(E) (ie. tableau du type générique E )
- intersect other : ARRAY(V) with comparator : {E,V;BOOLEAN} <-
(
...
);
Où 'other' est donc une collection contenant un autre type, et 'comparator' la primitive pour l'intersection, ie. fonction prenant E et V en paramètre et renvoyant TRUE si les paramètres sont considérés comme "égaux".
En situation, cela s'utilise comme suit
+ a : ARRAY(FOO);
+ b : ARRAY(BAR);
+ c : ARRAY(FOO);
... a et b sont remplis de diverses choses...
c := a.intersect b with { v1 : FOO ; v2 : BAR ; v1.msg1 = v2.msg2 };
Si je comprend bien (ou peut être que partiellement ?), il s'agirai de pouvoir définir des contraintes sur V ?
En Lisaac, j'imaginerai comme suit, avec la sémantique des contrats disponibles dans ce langage :
- intersect other : ARRAY(V) with comparator {E,V;BOOLEAN} <-
[ -? { + v : V ; v := V.create; v != NULL } ]
(
...
);
Mais en fait, lorsque je lis cela : http://www.devx.com/SpecialReports/Article/38864/0/page/2 , je me rend compte qu'il s'agit simplement de vérifier l'existance de méthodes.
Pour vous éviter à décrypter, je résume :
Si je fais :
template<typename T>
const T& min(const T& x, const T& y) {
return x < y? x : y;
}
et le concept associé :
concept LessThanComparable<typename T> {
bool operator<(const T& x, const T& y);
}
je dois donc préciser au compilateur avec un concept que T doit avoir un opérateur '<'?
Le compilateur n'est pas capable de le faire tout seul à la compilation ? C'est étonnant !
En Lisaac, (compilation globale oblige), tout est vérifié par le compilateur : si le compilateur dit OK, alors il n'y aura pas de problèmes.
Bref, j'ai parfois du mal à comprendre ce que ces features apportent de plus ?
En tout cas ça m'intéresse si ça peut nous permettre de l'implémenter, en mieux ;-)
« Il n’y a pas de choix démocratiques contre les Traités européens » - Jean-Claude Junker
[^] # Re: Déçu
Posté par Ontologia (site web personnel) . En réponse à la dépêche Retard(s) pour la prochaine version de C++. Évalué à 1.
En Lisaac, on a essayé de mettre en place une évol permettant de faire tout ce qu'on peut faire avec les templates, sachant que le langage possède à la base la généricité au niveau de l'objet.
ARRAY(E)La nouvelle fonctionalité de la prochaine version du compilo, consiste à permettre de définir des générique au niveau de la méthode.
Je l'ai voulu, car je voulais pouvoir faire ça, dans l'objet ARRAY(E) (ie. tableau du type générique E )
- intersect other : ARRAY(V) with comparator : {E,V;BOOLEAN} <-
(
...
);
Où 'other' est donc une collection contenant un autre type, et 'comparator' la primitive pour l'intersection, ie. fonction prenant E et V en paramètre et renvoyant TRUE si les paramètres sont considérés comme "égaux".
En situation, cela s'utilise comme suit
+ a : ARRAY(FOO);
+ b : ARRAY(BAR);
+ c : ARRAY(FOO);
... a et b sont remplis de diverses choses...
c := a.intersect b with { v1 : FOO ; v2 : BAR ; v1.msg1 = v2.msg2 };
Si je comprend bien (ou peut être que partiellement ?), il s'agirai de pouvoir définir des contraintes sur V ?
En Lisaac, j'imaginerai comme suit, avec la sémantique des contrats disponibles dans ce langage :
- intersect other : ARRAY(V) with comparator {E,V;BOOLEAN} <-
[ -? { + v : V ; v := V.create; v != NULL } ]
(
...
);
Façon moins déclarative de définir que ces exemples http://blog.emmanueldeloget.com/index.php/2008/08/27/136-le-(...) de vérifier qu'on ai bien un constructeur pour V.
Mais en fait, lorsque je lis cela : http://www.devx.com/SpecialReports/Article/38864/0/page/2 , je me rend compte qu'il s'agit simplement de vérifier l'existance de méthodes.
Pour vous éviter à décrypter, je résume :
Si je fais :
template<typename T>
const T& min(const T& x, const T& y) {
return x < y? x : y;
}
et le concept associé :
concept LessThanComparable<typename T> {
bool operator<(const T& x, const T& y);
}
je dois donc préciser au compilateur avec un concept que T doit avoir un opérateur '<'?
Le compilateur n'est pas capable de le faire tout seul à la compilation ? C'est étonnant !
En Lisaac, (compilation globale oblige), tout est vérifié par le compilateur : si le compilateur dit OK, alors il n'y aura pas de problèmes.
Bref, j'ai parfois du mal à comprendre ce que ces features apportent de plus ?
En tout cas ça m'intéresse si ça peut nous permettre de l'implémenter, en mieux ;-)
« Il n’y a pas de choix démocratiques contre les Traités européens » - Jean-Claude Junker