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 :

[Debutant]String et liste


Sujet :

Caml

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

    Informations forums :
    Inscription : Janvier 2009
    Messages : 22
    Points : 13
    Points
    13
    Par défaut [Debutant]String et liste
    Dans l'optique de m'entrainer sur les listes, je cherche un moyen de passer des strings en une liste de strings. Mon souci est que je ne sais pas comment faire pour indiquer a la machine comment distinguer la fin d'un mot et ainsi le placer dans la liste.
    Un exemple: "Pierre/Paul/Jacques" ----> [Pierre; Paul; Jacques]
    "1,2,3,4,....,n-1,n" ----> [1;2;3;4;5;...;n-1;n] (de facon plus generale)

    Est-ce possible ? (ca l'est surement) Et comment proceder pour y arriver ?

    Merci

  2. #2
    Membre émérite
    Avatar de prgasp77
    Homme Profil pro
    Ingénieur en systèmes embarqués
    Inscrit en
    Juin 2004
    Messages
    1 306
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur en systèmes embarqués
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 306
    Points : 2 466
    Points
    2 466
    Par défaut
    Salut,
    google + "ocaml string split" = Module Str, Str.split
    -- Yankel Scialom

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

    Informations forums :
    Inscription : Janvier 2009
    Messages : 22
    Points : 13
    Points
    13
    Par défaut
    Je vais regarder ca, mais apparemment mon ocaml ne connait pas le module Str, meme avec un #open Str

  4. #4
    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

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 14
    Points : 11
    Points
    11
    Par défaut
    Si le but est de s'entraîner, mieux vaut peut-être le faire tout seul. (Si, en revanche, tu veux utiliser cette fonction par la suite pour un projet plus important, mieux vaut utiliser Str qui sera a priori plus performante.)

    Je te propose un schéma de code (un "code à trou" si tu veux ) :
    Code OCaml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    let rec str_split str delim acc =
      try
        match String.get s 0
          | x when x=delim -> (???)::(str_split ??? delim ???)
          | x -> str_split ??? delim ???
      with _ -> []

    (Ce n'est bien sûr pas la seule façon de faire.)

    [HS]Il y a une coloration syntaxique pour OCaml sur le forum ?[/HS]

  6. #6
    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
    Citation Envoyé par Pece
    Il y a une coloration lexicale pour OCaml sur le forum ?
    Malheureusement non.
    Du même auteur: mon projet, le dernier article publié, le blog dvp et le jeu vidéo.
    Avant de poser une question je lis les règles du forum.

  7. #7
    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
    Bonsoir,

    Citation Envoyé par Yyukk
    Je vais regarder ca, mais apparemment mon ocaml ne connait pas le module Str, meme avec un #open Str
    Bon, il faut insérer la commande #load "str.cma" dans l'interpréteur ou compiler avec str.cma. #open Str ne veut rien dire (Str est un nom de module).

    Je suis un peu sceptique au sujet de la trame de code donnée par Pece_ même si l'intention (faire œuvre pédagogique plutôt que donner une réponse toute faite) est très bonne. Ce sont de simples réserves : d'abord dans ce code delim est un caractère, ce qui est moins général que la fonction Str.split (sans parler de rechercher un motif... on pourrait vouloir chercher une chaîne). Ensuite, l'appel récursif dans try... with est dangereux parce qu'il casse en douce la récursion terminale. D'accord, ici on s'en fiche. Seulement, peut-être que cet exemple peut inciter à faire pareil dans d'autres circonstances, et cela débouchera sur un débordement de pile inopiné. Idem pour l'emploi du filtrage, ici on peut se satisfaire d'un if then else. D'ailleurs, n'y aurait-il pas une erreur dans ce code ? Si une exception est levée, on renvoie [], mais pourquoi pas acc ?

    Je répète que l'intention est bonne. Il faut encourager les débutants à réécrire les fonctions de base qu'ils sont amenés à utiliser pour se les approprier et affiner leur compréhension d'OCaml. Attention quand même à la forme que l'on donne aux codes qui servent d'exemples, j'ai moi-même commis ce genre d'erreurs dans d'autres fils de discussion et, rétrospectivement, ça me semble assez problématique.

    Cordialement,
    Cacophrène

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 14
    Points : 11
    Points
    11
    Par défaut
    acc est une chaîne de carcactère. Mais en effet il y a une erreur, c'est [acc] qu'il faut renvoyer. (J'édite.)

    Pour le coup de try with qui casse la récursion terminale, ma récursion n'étant pas terminale... Ceci dit, elle est facilement transformable en terminale et à ce moment, une structure conditionnelle sur la longueur vaut peut-être mieux. A voir comment tout cela compile et l'optimisation de l'utilisation de la pile dans les différents cas.

    Ensuite pour delim, oui, on peut améliorer, je proposais un premier jet. On peut bien sûr améliorer la chose pour avoir un lot de délimiteurs, ou tout autre chose imaginable.

    Enfin, pour le matching, c'est vraiment juste une question de goût et de lisibilité dans ce cas-ci. Une structure conditionnelle aurait très bien fait l'affaire, je suis d'accord.

  9. #9
    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
    Bonjour,

    Un peu de hors sujet dont je tiens à m'excuser pour illustrer mon précédent message.

    Pour le coup de try with qui casse la récursion terminale, ma récursion n'étant pas terminale... Ceci dit, elle est facilement transformable en terminale et à ce moment, une structure conditionnelle sur la longueur vaut peut-être mieux. A voir comment tout cela compile et l'optimisation de l'utilisation de la pile dans les différents cas.
    Oui, ta fonction n'est pas récursive terminale, mais le problème du try...with est à considérer de façon plus générale. Il est tentant de l'utiliser un peu partout. Un exemple parmi d'autres :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    let read_lines file =
      let ich = open_in file in
      let rec loop lines =
        try
          loop (input_line ich :: lines)
       with End_of_file -> close_in ich; List.rev lines
      in loop []
    La fonction imbriquée loop a l'air récursive terminale, mais ce n'est pas le cas. À comparer avec ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    let read_lines file =
      let ich = open_in file in
      let rec loop lines =
        let may = try Some (input_line ich) with End_of_file -> None in
        match may with
        | None -> close_in ich; List.rev lines
        | Some line -> loop (line :: lines)
      in loop []
    De plus, s'il existe une condition d'arrêt facile sans passer par une exception, cela peut être beaucoup plus facile à déboguer ensuite...

    Et pour finir, le cas du match : oui et re-oui, ici ça n'est qu'une question de lisibilité. Cependant, les codes d'exemple sont souvent source d'inspiration pour les débutants, et l'utilisation de clauses when n'est pas toujours appropriée (impossible de vérifier l'exhaustivité du filtrage, par exemple).

    Cordialement,
    Cacophrène

Discussions similaires

  1. [Debutant String Conversion] String a convertir
    Par septox dans le forum Langage
    Réponses: 1
    Dernier message: 10/11/2005, 12h12
  2. [debutant][String] Remplacer une chaine de caractère contenant un ?
    Par Jarodnet dans le forum API standards et tierces
    Réponses: 3
    Dernier message: 12/10/2005, 12h47
  3. [Debutant][String]Supprimer accents
    Par TylerKnoxx dans le forum API standards et tierces
    Réponses: 5
    Dernier message: 06/09/2005, 14h48
  4. [Débutant][String] Opérations sur une chaîne
    Par gandalf_le_blanc dans le forum Général Java
    Réponses: 8
    Dernier message: 08/06/2004, 11h59
  5. [Débutant][String] Remplacez les caractères speciaux
    Par paf15 dans le forum API standards et tierces
    Réponses: 3
    Dernier message: 27/04/2004, 22h39

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