2.7 Indexer le fichier

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 in
  let process_scene () =
  	begin
	  incr scene_nr;
	  (* 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
	end
    in
  try
    while true do
      let ligne = input_line in_chan in
      if chaine_au_debut "Scène" ligne
      then process_scene ()
      else if chaine_au_debut "ACTE" ligne
      then
	begin
	  scene_nr := 0;
	  incr acte_nr
	end
      else if chaine_au_debut "FIN" ligne
      then raise End_of_file
      else
	begin
	  Buffer.add_string buffer ligne;
	  Buffer.add_char buffer '\n'
	end
    done;
    failwith "I should not be here"
  with
    End_of_file ->
      begin
        process_scene();
        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.