• [^] # Re: Déçu

    Posté par (site web personnel) . En réponse à la dépêche Retard(s) pour la prochaine version de C++. Évalué à 1.

    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 } ]
    (
    ...
    );

    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