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.
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));;
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;;