(* impératif *) let indexer_fichier fichier = let in_chan = open_in fichier and acte_nr = ref 0 and scene_nr = ref 0 and buffer = Buffer.create 10000 and table = Hashtbl.create 1000 and en_scene = ref false in let process_scene () = (* Printf.printf "acte %d scene %d\n" !acte_nr !scene_nr; *) decouper_mots (ajouter_dans_table table (!acte_nr, !scene_nr)) (String.lowercase (Buffer.contents buffer)); Buffer.reset buffer in try while true do let ligne = input_line in_chan in if chaine_au_debut "Scène" ligne then begin process_scene (); incr scene_nr; en_scene := true end else if chaine_au_debut "ACTE" ligne then begin process_scene (); scene_nr := 0; incr acte_nr; en_scene := false end else if chaine_au_debut "FIN" ligne then raise End_of_file else if !en_scene then begin Buffer.add_string buffer ligne; Buffer.add_char buffer '\n' end else () (* en dehors d'une scène *) done; failwith "I should not be here" with End_of_file -> begin process_scene(); close_in in_chan; table; end;;
Nous avons choisi ici un style impératif, reflétant le fait qu'une
lecture de fichiers fait des effets de bord. Nous lisons chaque ligne ;
si la ligne indique un changement de scène ou d'acte, nous agissons en
conséquence en mettant à jour les compteurs ; en fin de scène ou de
fichier, nous indexons les mots rencontrés dans la scène ; sinon, nous
accumulons la ligne dans buffer
,
qui contient tout le texte d'une scène lu jusqu'à présent.