On montre ici comment se traduiraient les particularités des évaluateurs Lisp présentés dans l'évaluateur qu'on a défini.
Pour réaliser la fermeture lexicale, il faut modifier la recherche d'une définition. Telle qu'elle est définie, la recherche retourne la définition isolée. On réalise alors une "sorte" de fermeture lexicale en plaçant dans le contexte d'évaluation l'environnement local qui a permis de trouver cette définition. Pour la vraie fermeture lexicale, on a besoin de connaître le contexte de définition du texte trouvé : la recherche retourne donc ce contexte, et on value ensuite dans le contexte construit en plaçant en priorité le contexte de définition.
On a alors l'alternative suivante :
La première solution fait perdre la notion de variable libre, ce qui me paraît regrettable. La deuxième gène une vue locale des définitions de texte. Par exemple, le texte :
def txt
= (use a) "," (use b)
semble être défini avec les variables libres a et b. Mais, si l'on regarde « plus haut », on peut découvrir :
def X
def a = "A"
def txt = ...
qui fait apparaître que a est en fait liée à la valeur "A", et que b semble toujours libre.
On privilégie donc l'environnement global dans lequel on évalue, qui est le « dernier environnement » où l'on puisse « remonter », quand on regarde les définitions de textes : c'est le seul environnement où l'on a l'assurance qu'une variable est bien libre. Cette approche se traduit en Scheme par la nécessité, à l'appel de la fonction eval, de fournir un environnement d'évaluation, qui tient lieu d'environnement global. Elle nuit à l'homogénéité des concepts, et n'a pas été retenue pour cela.