next up previous contents index
Next: Correction des programmes Up: Quelques éléments de Caml Previous: Expressions

Blocs et portée des variables

        Dans le corps des fonctions, on définit souvent des valeurs locales pour calculer le résultat de la fonction. Ces définitions sont introduites par une construction let ident = expression in .... Il n'y a pas de restriction sur les valeurs locales, et les définitions de fonctions sont admises. Ces fonctions locales sont elles-mêmes susceptibles de comprendre de nouvelles définitions de fonctions si nécessaire et ce ad libitum.

Lorsqu'on cite un identificateur x dans un programme, il fait nécessairement référence au dernier identificateur de nom x lié par une définition let, ou introduit comme paramètre d'une fonction après le mot-clé function.

En général, il est plus élégant de garder les variables aussi locales que possible et de minimiser le nombre de variables globales.

Ce mode de liaison des identificateurs (qu'on appelle la portée statique) est surprenant dans le système interactif. En effet, on ne peut jamais modifier la définition d'un identificateur; en particulier, la correction d'une fonction incorrecte n'a aucun effet sur les utilisations antérieures de cette fonction dans les fonctions déjà définies.

let successeur x = x - 1;;
let plus_deux x = successeur (successeur x);;
#plus_deux 1;;
- : int = -1

Ici, on constate la bévue dans la définition de successeur, on corrige la fonction, mais cela n'a aucun effet sur la fonction plus_deux.

#let successeur x = x + 1;;
successeur : int -> int = <fun>
#plus_deux 1;;
- : int = -1

La solution à ce problème est de recharger complètement les fichiers qui définissent le programme. En cas de doute, quitter le système interactif et recommencer la session.


next up previous contents index
Next: Correction des programmes Up: Quelques éléments de Caml Previous: Expressions

1/11/1998