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 :

Dupliquer une structure contenant des mutables [Débutant(e)]


Sujet :

Caml

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 32
    Points : 18
    Points
    18
    Par défaut Dupliquer une structure contenant des mutables
    Soit la structure 'toto' composée de 'champ1' et de 'champ2', tous les 2 mutables.

    Disons que j'ai une fonction 'print_toto' qui m'affiche joliment une variable de type toto.

    Si je fais:
    let var1 = {champ1 = some_val; champ2 = other_val} in
    let var2 = var1 in var2.champ1 <- new_val;
    print_toto var1;
    print_toto var2;

    On peut voir que var1 et var2 sont identiques, quand j'ai modifié le champ1 de var2, ca a aussi modifié celui de var1.

    Je voudrais savoir par quoi remplacer 'let var2 = var1 in' pour éviter cela.

    Bien sûr, je pourrais remplacer 'let var2 = var1 in var2.champ1 <- new_val' par 'let var2 = {champ1 = var1.champ1; champ2 = new_val} in', seulement en vrai ma structure toto a genre 15 champs, par très pratique quand il y a juste un champ qui doit être modifié dans la nouvelle variable.

    Merci d'avance du coup main ^^

  2. #2
    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 990
    Points
    2 990
    Par défaut
    La réponse est dans le manuel du langage.
    6.7.3 Operations on data structures/Records :
    http://caml.inria.fr/pub/docs/manual-ocaml/expr.html

  3. #3
    LLB
    LLB est déconnecté
    Membre expérimenté
    Inscrit en
    Mars 2002
    Messages
    967
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 967
    Points : 1 410
    Points
    1 410
    Par défaut
    Remplace :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    let var2 = var1 in var2.champ1 <- new_val;
    Par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    let var2 = {var1 with champ1 = new_val}
    Et songe à enlever les mutables si tu peux (ce n'est pas très joli).

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 32
    Points : 18
    Points
    18
    Par défaut
    Merci SpiceGuid, même si en tant que grand débutant, la solution au milieu de toute cette page ne pas pas vraiment sauter aux yeux sur le coup ^^.

    Merci LLB, j'étais en train de potasser en long la page du manuel, tu m'économises quelques essais-erreurs infructueux ^^.

    Même débutant, j'ai bien compris que le mutable c'est pas très élégant dans l'esprit de la prog fonctionnelle, seulement dans le cas présent, la structure provient d'une librairie pour faire du parsing de code, j'ai pas vraiment la possibilité de supprimer les mutables.

    Merci encore, ++

  5. #5
    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
    L'esprit des types enregistrement est la même que celui des n-uplets, à l'exception près que les champs sont nommés. On peut donc y avoir accès directement.

    Les champs des enregistrements modifiables sont à utiliser uniquement lorsqu'il est impossible de faire autrement.

    De façon générale, un bon programme ne devrait jamais utiliser des n-uplets non nommés, sauf pour les traitements intermédiaires ou les structures de données pour lesquelles leur utilisation s'impose d'elle-même. L'idée est généralement que, si il y a besoin de regrouper des données, c'est que ce regroupement est déjà une donnée en elle-même, donc possède un type.

  6. #6
    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
    À noter que le coup du "with" n'est qu'une jolie syntaxe pour copier les champs par valeur. Sans l'aide du manuel tu aurais pu trouver la solution suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    let var2 = {champ1 = var1.champ1; champ2 = var1.champ2}
    (c'est l'analogue de l'opération pour copier les références : let ref2 = ref !ref1)

    De façon générale, un bon programme ne devrait jamais utiliser des n-uplets non nommés, sauf pour les traitements intermédiaires ou les structures de données pour lesquelles leur utilisation s'impose d'elle-même.
    Autrement dit, "il ne faut jamais utiliser de n-uplets non nommés, sauf quand il faut".

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 32
    Points : 18
    Points
    18
    Par défaut
    Citation Envoyé par bluestorm Voir le message
    Sans l'aide du manuel tu aurais pu trouver la solution suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    let var2 = {champ1 = var1.champ1; champ2 = var1.champ2}
    Comme dis dans le premier post, j'y ai pensé, sauf qu'en pratique je n'ai pas 2 champs mais 15...

    Citation Envoyé par bluestorm Voir le message
    (c'est l'analogue de l'opération pour copier les références : let ref2 = ref !ref1)
    Je note ^^

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 2
    Dernier message: 07/11/2005, 18h54
  2. Comment déployer une appli contenant des TClientDataSet ?
    Par jobigoud dans le forum C++Builder
    Réponses: 6
    Dernier message: 26/10/2005, 19h18
  3. Réponses: 2
    Dernier message: 25/07/2005, 14h27
  4. Réparer une partition contenant des erreurs
    Par sdx dans le forum Administration système
    Réponses: 4
    Dernier message: 14/06/2005, 16h16
  5. Dupliquer une structure de table
    Par deviltaz dans le forum Access
    Réponses: 4
    Dernier message: 13/10/2004, 13h41

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