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 :

Quel substitut plus élégant à Printf.sprintf ?


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 Quel substitut plus élégant à Printf.sprintf ?
    Voilà un petit bout de code, je pense que c'est un peu cracra dans l'esprit ocaml d'écrire ça, je me demandais s'il y avait une manière plus élégante d'écrire ça tout en produisant exactement le même résultat.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    let test var = match
       | Type1 -> Printf.sprintf "%s avec %s" var.s1 var.s2
       | Type2 -> Printf.sprintf "- %s sans %s -" var.s1 var.s2
    Cordialement.

  2. #2
    Membre éprouvé
    Avatar de Cacophrene
    Homme Profil pro
    Biologiste
    Inscrit en
    Janvier 2009
    Messages
    535
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Biologiste

    Informations forums :
    Inscription : Janvier 2009
    Messages : 535
    Points : 1 125
    Points
    1 125
    Par défaut
    Salut !

    Première solution : avec et sans sont récupérés lors du filtrage pour former un troisième paramètre de sprintf.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    let test var typ =
      let str = match typ with
        | Type1 -> "avec"
        | Type2 -> "sans" 
      in Printf.sprintf "%s %s %s" var.s1 str var.s2
    Seconde solution : Tu as d'autres filtrages possibles qui changent complètement la forme du format. Mais par contre tous les formats demandent deux arguments de type string. On peut alors mettre à profit la fonction Scanf.format_from_string.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    let test var typ =
      let str = match typ with
        | Type1 -> "%s avec %s"
        | Type2 -> "%s sans %s" 
        | Type3 -> "foo %s bar %s foobar"
      in Printf.sprintf (Scanf.format_from_string str "%s%s") var.s1 var.s2
    Remarque : Un peu de magie (Obj.magic) fonctionnerait aussi, mais c'est sans contrôle et donc absolument pas recommandé.


    Cordialement,
    Cacophrène

  3. #3
    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
    Ou aussi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    let test var typ =
      let printer = match typ with
        | Type1 -> Printf.sprintf "%s avec %s"
        | Type2 -> Printf.sprintf "- %s sans %s -"
      in printer var.s1 str var.s2
    De façon plus moche :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    let test var typ =
      let fmt = match typ with
        | Type1 -> ("%s avec %s" : (_, _, _) format)
        | Type2 -> ("- %s sans %s -" : (_, _, _) format)
      in Printf.printf fmt var.s1 str var.s2

Discussions similaires

  1. Une RPN plus élégante
    Par prgasp77 dans le forum Caml
    Réponses: 2
    Dernier message: 18/03/2013, 17h29
  2. [XL-2003] Formule plus élégante ?
    Par vieuxmonsieur dans le forum Excel
    Réponses: 5
    Dernier message: 04/07/2011, 14h55
  3. switch case plus élégant
    Par Zikas-r dans le forum Langage
    Réponses: 3
    Dernier message: 05/06/2009, 09h50
  4. Réponses: 2
    Dernier message: 25/05/2009, 09h26
  5. Réponses: 3
    Dernier message: 26/06/2006, 16h44

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