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;- les trois lignes de code précédentes forment le corps de la fonction;
- notez que cette fonction ne retourne rien.
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 :
- On commence par :
let affiche_dix_fois
pour dire qu'on va associer le nom - On écrit le nom du paramètre, ici c'est
motif
. - Ensuite, on place le signe égal.
- On écrit en-dessous les instructions qui forment le corps de la fonction.
- On termine la déclaration de la fonction avec le mot
in
.
affiche_dix_fois
à quelque chose.
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.
- Une fonction doit toujours être définie avant de pouvoir être utilisée.
- N'oubliez pas de décaler vers la droite (indenter) le corps de la fonction et le
in
,
pour bien visualiser où commence et où se termine la déclaration.
- N'oubliez pas d'ajouter une ligne vide à la suite de la déclaration de la fonction, afin d'aérer convenablement le code.
- On utilisait déjà des fonctions prédéfinies utilisant un paramètre et ne retournant rien. Par exemple
print_int
et print_float
sont de telles fonctions.