Version sans JavaScript, en lecture seule : les ateliers, les quiz et l’exécution du code n’y sont pas. Version complète · Catalogue · Se connecter
Support de cours · chapitre 5
Aspects impératifs
Effets de bord, affichage, le type unit, les séquences et les blocs.
Impression
Impression de valeurs
Il existe des fonctions prédéfinies (des primitives) qui impriment à l'écran les valeurs « simples ». Elles sont différentes selon le type de la valeur à imprimer.
print_string "Bonjour" ;;La cellule affiche d'abord le texte imprimé, Bonjour, puis, comme toujours, le type et la valeur de l'expression : - : unit = (). Dans l'interprète ocaml en ligne de commande, les deux se retrouvent collés sur la même ligne, Bonjour- : unit = (), car print_string ne passe pas à la ligne.
Quel est son type ?
print_string ;;Il en existe une par type simple :
print_char 'a' ;;
print_int 42 ;;Et deux pour passer à la ligne : print_endline imprime une chaîne puis passe à la ligne, print_newline passe seulement à la ligne.
print_endline "Bonjour" ;;
print_newline () ;;
print_newline ;;Notion d'effet, type unit
Toutes ces fonctions rendent une valeur de type unit. Pourquoi ?
- En Caml, toute fonction doit renvoyer une valeur.
- Mais ces fonctions n'ont rien à calculer : leur intérêt est d'agir, ici d'afficher. On dit qu'elles procèdent par effet (ou effet de bord).
On utilise alors « rien », c'est-à-dire (), en guise de résultat ou d'argument. Le type unit est un type prédéfini qui ne contient qu'une seule valeur, (), qui signifie par convention « rien » (il n'y a pas de résultat intéressant).
() ;;print_newline n'a besoin d'aucune donnée : elle prend () en argument. Il ne faut pas oublier les parenthèses : print_newline seul est la fonction, pas son appel, et n'affiche rien.
Impressions successives : la séquence
Il est possible de faire plusieurs effets à la suite, en séquence. Évaluer en séquence deux expressions $e_1$ et $e_2$ signifie les évaluer successivement : $e_1$, puis $e_2$. Comme dans la plupart des langages, la séquence se note ; : on écrit e1 ; e2.
print_string "Bon" ; print_string "jour" ; print_newline () ;;La valeur d'une séquence est celle de sa dernière expression. Les valeurs des autres sont perdues : elles ne servent que pour leurs effets.
print_int 1 ; 2 ;;Si une expression autre que la dernière n'est pas de type unit, sa valeur est calculée pour rien ; Caml le signale :
1 ; 2 ;;Dans une fonction, la séquence permet d'enchaîner les affichages :
let affiche_somme a b =
print_int a ;
print_string " + " ;
print_int b ;
print_string " = " ;
print_int (a + b) ;
print_newline () ;;
affiche_somme 2 3 ;;Alternative et séquence
L'alternative sans else
let printEven n =
if n mod 2 = 0 then
print_int n ;;
printEven 4 ;;
printEven 3 ;;Qu'en pensez-vous ? Au chapitre 3, on a dit que la branche else était obligatoire.
let f n = if n > 0 then 1 ;;Les blocs
Que se passe-t-il si une branche de l'alternative doit faire plusieurs choses ?
let signe_faux n =
if n >= 0 then
print_string "positif" ;
print_newline () ;;
signe_faux (-2) ;;Malgré l'indentation, le ; est moins prioritaire que l'alternative : la fonction se lit (if n >= 0 then print_string "positif") ; print_newline (). Le passage à la ligne a lieu dans tous les cas.
Pour regrouper plusieurs expressions dans une branche, on les entoure de begin … end (ou de parenthèses) :
let signe n =
if n >= 0 then begin
print_string "positif" ;
print_newline ()
end else begin
print_string "négatif" ;
print_newline ()
end ;;
signe (-2) ;;