Nous proposons deux versions de la même fonction : l'une utilisant une boucle et une référence, l'autre avec deux fonctions mutuellement récursives.

Version avec boucle et références

let decouper_mots stockage s =
  let left = ref (-1) in
  let process_word i =
    if !left >= 0
    then (stockage (String.sub s !left (i - !left));
	  left := -1)
  in
  for i=0 to pred (String.length s)
  do
    if est_une_lettre (String.get s i)
    then
      (if !left < 0
      then left := i)
    else process_word i
  done;
  process_word (pred (String.length s));;

Version récursive

let decouper_mots stockage s =
  let n = String.length s in
  let rec decouper_dans_lespace i =
    if i >= n
    then ()
    else
      if est_une_lettre (String.get s i)
      then decouper_dans_le_mot i (succ i)
      else decouper_dans_lespace (succ i)
  and decouper_dans_le_mot debut_du_mot i =
    if i >= n
    then stockage (String.sub s debut_du_mot (i - debut_du_mot))
    else
      if est_une_lettre (String.get s i)
      then decouper_dans_le_mot debut_du_mot (succ i)
      else
        begin
          stockage (String.sub s debut_du_mot (i - debut_du_mot));
          decouper_dans_lespace (succ i)
        end
  in decouper_dans_lespace 0;;