-
Var
E(x) = vE|- x Þ v
Une variable vaut sa valeur dans son environnement de calcul. Si la variable
n'était pas liée, le vérificateur n'aurait pas pu typer l'expression.
- (Pair)
E|- e1 Þ v1 E|- e2 Þ v2
E|- (e1,e2) Þ (v1,v2)
- (List)
E|- e1 Þ v1 E|- e2 Þ v2
E|- e1::e2 Þ v1::v2
- (If1)
E|- e1 : true E|- e2 : v2
E|- (if e1 then e2 else e3) Þ v2
On évalue d'abord la condition. Selon sa valeur la branche gauche (If1)
ou droite (If2) est évaluée.
- (If2)
E|- e1 : false E|- e3 : v3
E|- (if e1 then e2 else e3) Þ v3
- (Abs)
E|- (function x ->
e) Þ <E,(function x ->
e)>
Une abstraction crée une fermeture (couple environnement E, expression fonctionnelle). Ainsi toutes les variables libres du corps de la fonction
sont liées à l'environnement E.
- (App)
E|- e1 Þ <E1,(function x ->
e)> E|- e2 Þ v2 (x:v2)::E1|- e Þ v
E|- (e1 e2) Þ v
L'évaluation du corps d'une fermeture s'effectue toujours dans l'environnement de la fermeture.
- (Let)
E|- e1 Þ v1 (x:v1)::E|- e2 Þ v2
E|- let x = e1 in e2 Þ v2
Une déclaration locale augmente l'environnement de calcul du corps de
l'expression.
- (LetRec)
E1=(f:<E1,(function x ->
e)>)::E|- e2 Þ v2
E|- let rec f = e1 in e2 Þ v2
Il y a une difficulté pour construire l'environnement E1 de
la fermeture f. En effet cet environnement doit contenir f dans la liste
des variables car f peut apparaitre dans son corps.