L'environnement lexical d'une fonction (ou d'un bloc) est l'environnement dans lequel cette fonction (ou bloc) apparaît (c'est-à-dire l'environnement issu des définitions et déclarations des blocs et fonctions englobants).
L'environnement dynamique est
l'environnement au moment de l'appel de cette fonction. Pour presque
tous les langages de programmation, un nom qui n'est pas
local à une procédure réfère à sa valeur dans l'environnement
lexical..
Exemple:
module M var int a=0; var int x; function F(); begin return a; end f; procedure G(); var a; begin a=1; x=f(); end g; begin G(); end;avant l'appel de F() dans G() on est dans la situation :
et dans l'environnement dynamique de F, la variable a sera a , alors que
dans l'environnement lexical a sera a
(M est le seul bloc englobant F).
La valeur de a sera donc celle de l'environnement lexical 0 et donc après
le retour de F, la variable x sera égale à 0, alors que si F était évalué dans
l'environnement dynamique x serait égal à 1.
Il paraît raisonnable de considérer qu'un programme ne doit pas dépendre du nom des variables; en conséquence, si on fait un renommage ``cohérent'' des variables, le programme doit donner les mêmes résultats. Soit le résultat du renommage de a de G en b:
module m var int a=0; var int x; function f(); begin return a; end f; procedure g(); var b; begin a=1; x=f(); end g; begin g(); end;Si f était évalué dans l'environnement dynamique, la valeur de x sera 1. Comme on le voit, si un programme ne dépend pas du nom donné aux variables, une fonction ne peut être évaluée que dans son environnement lexical.
Cette règle doit aussi s'appliquer aux fonctions passées en paramètre.
Exemple:
module var a; procedure P(); var x,y,z; procedure Q(); var x; procedure R(); var y; begin ... P(); ... end R; begin ... R();... end Q; begin ... Q(); end P; begin ...P(); end moduleL'exécution donnera en numérotant les appels:
de façon claire, a , y
, x
et z
sont accessibles; l'environnement lexical de R
est l'environnement
provenant de M, P
, Q
;
a , x
,y
et z
sont accessibles; l'environnement
lexical est celui de M, alors que l'environnement dynamique serait celui de
l'appel (M, P
, Q
, R
)
a , x
,y
et z
sont accessibles