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