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