IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Caml Discussion :

Tester si une expression est de tel type


Sujet :

Caml

  1. #21
    Rédacteur/Modérateur

    Avatar de gorgonite
    Homme Profil pro
    Ingénieur d'études
    Inscrit en
    Décembre 2005
    Messages
    10 322
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur d'études
    Secteur : Transports

    Informations forums :
    Inscription : Décembre 2005
    Messages : 10 322
    Points : 18 681
    Points
    18 681
    Par défaut
    Citation Envoyé par HanLee Voir le message
    Problème avec une hiérarchie de classes, tu fais comment pour rajouter des nouvelles fonctions?
    Une hiérarchie de classe est ouvert pour l'espace des types, mais fermé pour les algorithmes.

    L'interface d'une classe mère, c'est quelque chose de fermé. La solution c'est de faire un visiteur, et du coup on bloque l'espace des types.

    Et ça revient à faire Boost.Variant en moins bien.

    que veux-tu dire par ajouter des fonctions ?

    si tu parles de la déclaration de blocs de code correspondants à une fonction dans le langage "parsé", il suffit de concevoir la déclaration d'une fonction, comme une phase de déclaration quelconque... faut juste savoir à quel niveau l'intégrer (ça dépend des langages), idem pour les lambda-expressions

    si tu parles d'ajout d'algos de traitement sur ton CFG, ce n'est pas vraiment compliqué... avec une méthode handle, et une classe VirtualTask dérivée pour chaque algo à appliquer

    dans les deux cas, ça se fait bien... et la solution boost::variant me semble beaucoup moins extensible


    après clairement, si tu dois gérer ta mémoire (C++ donc ), il est clair qu'il ne faut pas utiliser des pointeurs "à la C", mais des choses plus subtiles...

  2. #22
    Alp
    Alp est déconnecté
    Expert éminent sénior

    Avatar de Alp
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    8 575
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Points : 11 861
    Points
    11 861
    Par défaut
    Citation Envoyé par gorgonite Voir le message
    après clairement, si tu dois gérer ta mémoire (C++ donc ), il est clair qu'il ne faut pas utiliser des pointeurs "à la C", mais des choses plus subtiles...
    i.e ce que tout bon programmeur C++ fait de nos jours

  3. #23
    Rédacteur/Modérateur

    Avatar de gorgonite
    Homme Profil pro
    Ingénieur d'études
    Inscrit en
    Décembre 2005
    Messages
    10 322
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur d'études
    Secteur : Transports

    Informations forums :
    Inscription : Décembre 2005
    Messages : 10 322
    Points : 18 681
    Points
    18 681
    Par défaut
    Citation Envoyé par Alp Voir le message
    i.e ce que tout bon programmeur C++ fait de nos jours
    j'ai jamais dit le contraire...

    je dis juste que j'avais la flemme de le mettre dans mon exemple de hiérarchie de classes

  4. #24
    Membre éclairé Avatar de HanLee
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    738
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2004
    Messages : 738
    Points : 871
    Points
    871
    Par défaut
    Citation Envoyé par gorgonite Voir le message
    que veux-tu dire par ajouter des fonctions ?

    si tu parles de la déclaration de blocs de code correspondants à une fonction dans le langage "parsé", il suffit de concevoir la déclaration d'une fonction, comme une phase de déclaration quelconque... faut juste savoir à quel niveau l'intégrer (ça dépend des langages), idem pour les lambda-expressions

    si tu parles d'ajout d'algos de traitement sur ton CFG, ce n'est pas vraiment compliqué... avec une méthode handle, et une classe VirtualTask dérivée pour chaque algo à appliquer

    dans les deux cas, ça se fait bien... et la solution boost::variant me semble beaucoup moins extensible


    après clairement, si tu dois gérer ta mémoire (C++ donc ), il est clair qu'il ne faut pas utiliser des pointeurs "à la C", mais des choses plus subtiles...
    CFG ?

    Je voulais dire : ajouter une fonction qui prend un 'a ast en paramètre.

    En OCaml, si tu as un type somme, tu peux ajouter facilement de telles fonctions. Mais tu ne peux pas rajouter facilement des "sous-types" à 'a ast.

    En C++, avec une hiérarchie de classe, de manière simpliste, tu fais des fonctions virtuelles. Mais naïvement, l'ensemble des fonctions virtuelles est statique et non extensible.
    Par contre, tu peux ajouter autant de sous-types que tu veux. En CAML, tu ne peux pas faire ça.

    La solution typique OO c'est le visiteur.

    Si je comprend bien, c'est l'équivalent ta méthode Handle() qui prend en argument ta classe abstraite VirtualTask.
    Du coup, tu ne peux plus ajouter de nouveau sous-type à la hiérarchie de classe (sans modifier VirtualTask).

    Et là j'ai dit que ça revient à faire Boost.Variant.
    On a pas forcément besoin de créer nos propres classes non plus (à part pour les algorithmes).

    Exemple : boost::variant<int, std::string>.

  5. #25
    LLB
    LLB est déconnecté
    Membre expérimenté
    Inscrit en
    Mars 2002
    Messages
    968
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 968
    Points : 1 412
    Points
    1 412
    Par défaut
    Merci pour l'exemple !

    Citation Envoyé par Alp Voir le message
    Par contre, il s'agissait bien de vous montrer que le C++ est un chouilla sous-estimé et ramené au niveau de Java/C# pour beaucoup de choses, à tort
    Oui, je n'ai pas l'habitude de Boost, mais je connais assez bien le reste (ce qui est en standard : les fonctionnalités du langage et la STL).

    Pour C#, c'était un langage pourri il y a quelques années, mais il y a eu beaucoup d'améliorations depuis. Ce n'est pas la peine de relancer le troll C# / C++, mais C# se défend vraiment bien maintenant (même s'il n'a pas les templates).

  6. #26
    Rédacteur/Modérateur

    Avatar de gorgonite
    Homme Profil pro
    Ingénieur d'études
    Inscrit en
    Décembre 2005
    Messages
    10 322
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur d'études
    Secteur : Transports

    Informations forums :
    Inscription : Décembre 2005
    Messages : 10 322
    Points : 18 681
    Points
    18 681
    Par défaut
    Citation Envoyé par HanLee Voir le message
    CFG ?
    cfg = control flow graph

    Citation Envoyé par HanLee Voir le message
    Si je comprend bien, c'est l'équivalent ta méthode Handle() qui prend en argument ta classe abstraite VirtualTask.
    Du coup, tu ne peux plus ajouter de nouveau sous-type à la hiérarchie de classe (sans modifier VirtualTask).

    Et là j'ai dit que ça revient à faire Boost.Variant.
    On a pas forcément besoin de créer nos propres classes non plus (à part pour les algorithmes).

    Exemple : boost::variant<int, std::string>.

    non, ce n'est pas ce que je voulais dire... et inutile de dire que tout revient boost:variant sinon je vous ressors mon troll sur tout revient à void*


    je reviendrais dessus quand j'aurais du temps

  7. #27
    Membre éclairé Avatar de HanLee
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    738
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2004
    Messages : 738
    Points : 871
    Points
    871
    Par défaut
    Citation Envoyé par gorgonite Voir le message
    non, ce n'est pas ce que je voulais dire... et inutile de dire que tout revient boost:variant sinon je vous ressors mon troll sur tout revient à void*
    C'est ce que j'ai compris qui revenait, à Boost.Variant.

    je reviendrais dessus quand j'aurais du temps
    Ah bah excuse-moi, on t'attend.

    ----------------------

    PS : de toute façon, je montre cette solution Boost.Variant, mais j'aime pas ça. C'est imbitable.

    J'ai un projet personnel sur de la manipulation d'expression arborescentes intuitive, j'ai commencé à faire un arbre avec Boost.Variant. C'était déjà dégueu, et au moment de faire les algorithmes, j'me suis vite réfugié vers OCaml.

    Pour :
    - son pattern-matching et donc du code concis
    - ses temps de compilation
    - l'interpréteur interactif
    - des erreurs de compilation plus clairs.

    Pour un petit module avec des algorithmes pas compliqués, Boost.Variant est envisageable, ou bien avec un type non récursif.

  8. #28
    Membre éprouvé
    Avatar de InOCamlWeTrust
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    1 036
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 1 036
    Points : 1 284
    Points
    1 284
    Par défaut
    Et en FORTRAN 77 on fait comment ?


  9. #29
    Alp
    Alp est déconnecté
    Expert éminent sénior

    Avatar de Alp
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    8 575
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Points : 11 861
    Points
    11 861
    Par défaut
    Citation Envoyé par LLB Voir le message
    Pour C#, c'était un langage pourri il y a quelques années, mais il y a eu beaucoup d'améliorations depuis. Ce n'est pas la peine de relancer le troll C# / C++, mais C# se défend vraiment bien maintenant (même s'il n'a pas les templates).
    Oui c'est vrai que c'est sympa. Mais les templates ça manque
    D'un autre côté, il est bien pour ce qu'on lui demande de faire

    Citation Envoyé par InOCamlWeTrust Voir le message
    Et en FORTRAN 77 on fait comment ?

    TU FAIS PAS

  10. #30
    Membre éprouvé
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    832
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 832
    Points : 1 104
    Points
    1 104
    Par défaut
    En OCaml, si tu as un type somme, tu peux ajouter facilement de telles fonctions. Mais tu ne peux pas rajouter facilement des "sous-types" à 'a ast.

    En C++, avec une hiérarchie de classe, de manière simpliste, tu fais des fonctions virtuelles. Mais naïvement, l'ensemble des fonctions virtuelles est statique et non extensible.
    Par contre, tu peux ajouter autant de sous-types que tu veux. En CAML, tu ne peux pas faire ça.
    Si, avec des variantes polymorphes :
    http://caml.inria.fr/pub/papers/garr...use-2000.ps.gz

  11. #31
    Membre émérite
    Avatar de SpiceGuid
    Homme Profil pro
    Inscrit en
    Juin 2007
    Messages
    1 704
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2007
    Messages : 1 704
    Points : 2 991
    Points
    2 991
    Par défaut
    C'est rare qu'on veuille à la fois l'extensibilité pour les fonctions et pour les données, mais au cas où les variants polymorphes ont été conçus pour ça.

  12. #32
    Inactif  
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    1 958
    Détails du profil
    Informations personnelles :
    Âge : 59
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 1 958
    Points : 2 467
    Points
    2 467
    Par défaut
    Citation Envoyé par LLB Voir le message
    [...]C# se défend vraiment bien maintenant (même s'il n'a pas les templates).
    D'un autre côté, les templates ont été fait pour surmonter les limitations au point de vue réflexivité en C++. Smalltalk n'avait pas ce problème. Si je ne me trompe pas C# ne l'a pas non plus. Attention, je ne dis pas que l'un est meilleur que l'autre et je ne dis pas que les templates en sont restés au même stade depuis.

  13. #33
    Membre éprouvé
    Avatar de InOCamlWeTrust
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    1 036
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 1 036
    Points : 1 284
    Points
    1 284
    Par défaut
    Citation Envoyé par SpiceGuid Voir le message
    C'est rare qu'on veuille à la fois l'extensibilité pour les fonctions et pour les données, mais au cas où les variants polymorphes ont été conçus pour ça.
    Plus simple et plus beau : l'héritage et la programmation objet.

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 2 PremièrePremière 12

Discussions similaires

  1. Réponses: 2
    Dernier message: 16/02/2015, 17h57
  2. comment tester si une variable est de type indifined
    Par amelhog dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 10/08/2005, 10h32
  3. Tester si une table est vide
    Par rsc dans le forum SQL
    Réponses: 2
    Dernier message: 01/07/2004, 17h25
  4. [JDBC]tester si une table est vide
    Par zozolh2 dans le forum JDBC
    Réponses: 5
    Dernier message: 28/05/2004, 10h17
  5. tester si une date est valide
    Par Andry dans le forum Langage
    Réponses: 5
    Dernier message: 17/09/2002, 12h54

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo