Sur Section 3.2.2 de SICP l'exécution du morceau de code suivant
(define (square x)
(* x x))
(define (sum-of-squares x y)
(+ (square x) (square y)))
(define (f a)
(sum-of-squares (+ a 1) (* a 2)))
(f 5)
est expliqué en termes de ce schéma .
Chaque fois qu'une fonction est appliquée, un nouveau cadre est créé (étiqueté par E1
par le biais de E4
) qui représente un ensemble de liaisons entre des symboles et des valeurs. Lorsqu'un symbole n'est pas lié dans un cadre, l'environnement englobant de ce cadre est interrogé pour trouver une liaison de ce symbole particulier.
Ce qui est intéressant dans ce diagramme, c'est que tous les cadres étiquetés par E
est contenue dans l'environnement global. Le texte explique que cela est dû au fait que les fonctions ont été définies dans l'environnement global, mais ne s'étend pas sur la question :
Remarquez que chaque cadre créé par
square
pointe vers l'environnement global, puisque c'est l'environnement indiqué par la balisesquare
objet de la procédure.
Si, au lieu de cela, les cadres étaient contenus dans l'environnement dans lequel la fonction a été appelée, par exemple E3
était contenu dans E2
qui, à son tour, était contenu dans E1
Est-ce que ce serait un modèle valable de fonctionnement d'un langage à portée dynamique ? De plus, la façon dont les cadres dans le diagramme ont le même environnement 'parent' est due au fait que Scheme est lexical scoped ?