Adloun

Programmation impérative : références et boucles

Cours · OCaml (option informatique), chapitre 4 · prépas MPSI et MP, option informatique · le début du chapitre, la suite sur Adloun

Un organigramme : une condition choisit entre deux chemins, et une boucle revient au test tant que la condition est vraie.

4.1 Introduction et motivation

OCaml n'est pas un langage purement fonctionnel : il offre aussi un style impératif, où l'on modifie l'état de la machine au fil du temps. Pourquoi s'en servir alors que la récursion suffit ? Parce que certains calculs s'expriment plus naturellement par une boucle et une variable qui évolue : compter, accumuler, itérer un nombre connu de fois. Le programme officiel le souligne toutefois : les références doivent être utilisées à bon escient. On ne renonce pas au style fonctionnel ; on ajoute un outil, qu'on emploie là où il clarifie.

Ce chapitre présente les briques de l'impératif en OCaml : la notion d'effet et le type unit, la séquence, les références (la seule forme de variable modifiable vue ici), et les deux boucles while et for. On retrouvera, transposé aux boucles while, l'outil de validation déjà central en Python : le variant, qui prouve qu'une boucle se termine.

4.2 Effets, unit et séquence

En OCaml, il n'y a pas d'instruction au sens de Python : tout est expression. Une expression évaluée pour son effet (afficher, modifier une case mémoire) et non pour sa valeur a le type unit, dont l'unique valeur est notée ().


# print_string "Bonjour";;
Bonjour- : unit = ()
iRemarqueAffichage : rappel

Les fonctions d'affichage print_int : int -> unit, print_string : string -> unit et print_float : float -> unit produisent un effet (l'écriture à l'écran) et renvoient (). Ce sont des fonctions « à effet », typiques de l'impératif.

4.2.1 La séquence

Pour enchaîner deux expressions, on les sépare par un point-virgule ; : l'expression e1 ; e2 évalue e1 (pour son effet — e1 doit être de type unit), puis e2, et sa valeur est celle de e2.


let saluer () =
  print_string "Bonjour, ";
  print_string "le monde";
  print_newline ()
Attention

Ne pas confondre les trois points-virgules d'OCaml : ; (séquence entre expressions), ; séparateur d'éléments de liste ([1; 2; 3]), et ;; (fin de phrase au toplevel). Le contexte les distingue, mais c'est une source d'erreurs au début. Si e1 dans e1 ; e2 n'est pas de type unit, le compilateur émet un avertissement : sa valeur serait jetée.

Exercices du chapitre

La suite du cours · Tous les exercices du chapitre