In Section 3.2.2 of SICP the execution of the following piece of code
(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)
is explained in terms of this diagram.
Each time a function is applied, a new frame is created (labeled by E1
through E4
) which represents a set of bindings between symbols and values. When a symbol is not bound in a frame, that frame's enclosing environment is queried for a binding of that particular symbol.
The interesting thing about this diagram is that all the frames labelled by E
is contained in the global environment. The text explains that this is because the functions was defined in the global environment, but does not elaborate on the issue:
Notice that each frame created by
square
points to the global environment, since this is the environment indicated by thesquare
procedure object.
If instead frames where contained in the environment that the function was called in, say E3
was contained in E2
which in turn was contained in E1
, would that be a valid model of how a dynamically scoped language works? Also, is the way that the frames in the diagram have the same 'parent' environment because Scheme is lexically scoped?