Lexical vs dynamic scoping in terms of SICP's

2020-07-05 05:26发布

问题:

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 the square 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?

回答1:

The answer to both questions is yes. That chapter of SICP is explaining lexical scope without actually using the term. Changing the evaluation mechanism as you describe would create a dynamically-scoped model.