[ocaml] erreur de syntax oui, mais où ?

dead brain -  
KX Messages postés 19031 Statut Modérateur -
Salut !

J'ai attaqué le ocaml ce matin et je me retrouve face à pas mal d'erreur de syntaxe.
Sans doute de grosses bourde de débutant qui connait pas les subtilité du langage mais ça tombe bien ! c'est mon cas !

Bref, je vous explique le principe :
Dans une boucle, je demande au user de rentrer une valeur, j'ajoute cette dernière dans une liste et je fais la moyenne des données présentes dans la liste.

Le code :


let rec longeur ls =
match ls with
| [] -> 0
| head :: queue -> 1 + longeur queue ;;

let rec somme ls =
match ls with
| [] -> 0
| head :: queue -> head + somme queue;;

let moyenne ls = float_of_int (somme ls) /. float_of_int (longeur ls) ;;

let main x =
let tab = []
let intern_loop() =
let nbr = get_user_input in
tab := nbr :: tab
moyenne tab
in intern_loop() ;;


Les erreurs semblent être liées aux lignes
 let tab = [] ; 

et
 nbr :: tab  (* ajout dans le tableau *)


Le retour du compilateur :
$ ocamlc typestat.ml
$ ocamlc typestat.ml
File "typestat.ml", line 15, characters 4-7:
Error: Syntax error


mais sincèrement, étant tout frais la dedans, j'ai pas le recul pour comprendre.

Merci d'avance !

1 réponse

  1. KX Messages postés 19031 Statut Modérateur 3 020
     
    Bonjour,

    Ligne 15 (comme indiqué par le compilateur) il te manque un
    in
    pour déclarer (let) une variable à l'intérieur d'une déclaration (let) de la fonction.

    let tab = [] in

    Mais clairement l'imbrication de fonctions doit être éviter, donc découpes ton main pour en sortir intern_loop.
    0
    1. dead brain
       
      Bon, suite a tes recommandations, j'ai fait des modifs, et une chose est sûre : je maitrise pas les scopes ^^'

      let rec longeur ls =
      match ls with
      | [] -> 0
      | head :: queue -> 1 + longeur queue ;;

      let rec somme ls =
      match ls with
      | [] -> 0
      | head :: queue -> head + somme queue;;

      let moyenne ls = float_of_int(somme ls) /. float_of_int(longeur ls) ;;

      let rec infinite_loop tableau =
      moyenne tableau ;;
      let nbr = read_int() in
      infinite_loop (nbr :: tableau)

      let main x =
      let values = [] in
      infinite_loop values ;;


      amène des erreur unbound values.
      File "typestat.ml", line 16, characters 31-38:
      Error: Unbound value tableau


      alors que tableau est fourni en argument ...

      qu'on soit clair : il y a aussi des problèmes d'algo, plein. mais ça, je verrais par moi même, ici le but c'est de comprendre mes erreurs de syntaxe.
      0
    2. KX Messages postés 19031 Statut Modérateur 3 020
       
      La déclaration de
      infinite_loop 
      se termine ligne 14 après
      ;;
      donc les lignes qui suivent ne sont plus dans cette déclaration, en particulier on ne peut plus utiliser
      tableau
      ligne 16.
      0