Traits impératifs
Les références Caml-Light correspondent aux variables des langages
impératifs. Ce sont des ``boites'' dans lesquelles on peut ``mettre'' des
valeurs de type fixé.
Caml-Light |
C |
let r = ref 1 |
int r = 1 |
On distingue la référence de son contenu |
r := !r + 1 |
r = r + 1 |
On a alors un modèle dynamique de mémoire analogue aux environnements
mais dont les ``clés'' sont des références.
L'affectation
(prefix :=):aref ->a -> unit
modifie la valeur associée à la clé, la création
ref :a->aref
-
rajoute une nouvelle référence dans l'environnement,
-
crée une entrée associée à cette valeur dans la mémoire.
Soit M l'état mémoire d'un programme et E l'environnement courant ,
let r = ref v introduit
-
un nouvel environnement
E' =ë(r=vr)<|Eû
où vr est une nouvelle
valeur telle que r -E'-> vr
- un nouvel état mémoire M'=é(vr¬v)<|Mù.
on dit parfois que vr est un pointeur sur v ou l'adresse de
v.
Si r -E-> vr
-
on consulte le contenu de vr par !r et on note M|>vr
-
l'instruction r := v' ne modifie pas
l'environnement courant E mais affecte la mémoire courante M :
é(M|>vr)¬v'ù où v' -E-> v'
Il n'y a pas de masquage dans la mémoire :
é(M|>vr)¬v'ù |
= |
é(é(vr¬v)<|M'ù|>vr)¬v'ù |
= |
é(vr¬v')<|M'ù |
L'état d'un programme est alors donné par le couple (E, M).
Les vecteurs (vect), enregistrements (record) dont les
champs sont déclarés mutables (mutable) suivent le même modèle.
let foo =
let c = ref 0 in
function () ->
begin c := !c + 1 ; !c end ;;
incrémente un compteur local à la fonction à chaque appel.
let foo = function () ->
let c = ref 0 in
begin c := !c + 1 ; !c end ;;
Crée un nouveau compteur à chaque appel.
Que fait ? function c -> begin c := !c + 1 ; c end