Reprenons l'exemple utilisé dans la problématique :
for colonne = 1 to 10 do print_string "X"; done; for colonne = 1 to 10 do print_string "#"; done;
La différence entre les deux codes est juste la chaîne après le print_string
. Pour faire apparaître clairement que tout le reste du code est identique dans les deux cas, on va réécrire le code en nommant une variable motif
égale à la chaîne en question.
La première boucle devient :
let motif = "X" in for colonne = 1 to 10 do print_string motif; done;
Tandis que la seconde devient :
let motif = "#" in for colonne = 1 to 10 do print_string motif; done;
L'idée est d'utiliser une fonction qui va prendre en argument une certaine chaîne nommée motif
, et qui va effectuer :
for colonne = 1 to 10 do print_string motif; done;
motif
sera l'argument (le paramètre) de la fonction;Il ne nous reste plus qu'à trouver un nom pour la fonction.
Pour nommer une fonction, on choisit toujours un nom décrivant précisément l'action réalisée par le corps de cette fonction.
Dans notre cas, "affiche_dix_fois"
est un bon nom.
On a la règle suivante.
Pour définir une fonction, on écrit :
let (...nom de la fonction...) (...noms des arguments...) = (...instructions du corps de la fonction...) in
Dans notre exemple, cela donne :
let affiche_dix_fois motif = for colonne = 1 to 10 do print_string motif; done; in
Regardons cela de près :
let affiche_dix_fois
pour dire qu'on va associer le nomaffiche_dix_fois
à quelque chose.
motif
.in
.Pour appeler une fonction qui ne retourne rien, on écrit :
(...nom de la fonction...) (...valeurs des arguments...) ;
On peut donc remplacer :
for colonne = 1 to 10 do print_string "X"; done;
par :
affiche_dix_fois "X";
En procédant de même pour le reste du code, on remplace au final le source :
for colonne = 1 to 10 do print_string "X"; done; for colonne = 1 to 10 do print_string "#"; done;
par cet autre source :
let affiche_dix_fois motif = for colonne = 1 to 10 do print_string motif; done; in affiche_dix_fois "X"; affiche_dix_fois "#";
Ces deux sources produisent le même affichage mais ne fonctionnent pas de la même manière.
Quelques petites remarques avant de passer aux exercices.
in
,print_int
et print_float
sont de telles fonctions.