В Раздел 3.2.2 SICP выполняется следующий фрагмент кода
(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)
объясняется в терминах этой диаграммы:
Каждый раз, когда применяется функция, создается новый фрейм (помеченный E1
через E4
), который представляет собой набор привязок между символами и значениями. Когда символ не связан в кадре, запрашивается среда окружения кадра для привязки этого конкретного символа.
Интересная вещь в этой диаграмме заключается в том, что все кадры, помеченные E
, содержатся в глобальной среде. В тексте объясняется, что это связано с тем, что функции были определены в глобальной среде, но не уточняет проблему:
Обратите внимание, что каждый кадр, созданный
square
, указывает на глобальную среду, так как это среда, указанная объектом процедурыsquare
.
Если вместо фреймов, содержащихся в среде, в которой была вызвана функция, например E3
, содержалась в E2
, которая, в свою очередь, содержалась в E1
, была бы допустимой моделью того, как язык с динамическим охватом работает? Кроме того, способ, которым кадры на диаграмме имеют одну и ту же "родительскую" среду, поскольку схема лексически ограничена?