Node:Сцепление окружений, Next:, Previous:Локальные переменные, Up:О замыкании

[Показать/скрыть оригинал] [Показать/скрыть перевод] [Переключить перевод и оригинал]


14.4.3 Environment Chaining

14.4.3 Сцепление окружений

In the example of the previous subsection, we glossed over an important point. The body of the let expression in that example refers not only to the local variable s, but also to the top level variables a, b, c and sqrt. (sqrt is the standard Scheme procedure for calculating a square root.) If the body of the let expression is evaluated in the context of the local let environment, how does the evaluation get at the values of these top level variables?

В примере из предыдущего подраздела мы упустили важный момент. Тело выражения let в этом примере ссылается не только на локальную переменную s, но так же на переменные верхнего уровня a, b, c и sqrt. (sqrt - стандартная процедура Scheme для вычисления арифметического корня). Если тело let-выражения вычисляется в локальном окружении let, каким образом при вычислении получают значения переменных верхнего уровня?

The answer is that the local environment created by a let expression automatically has a reference to its containing environment -- in this case the top level environment -- and that the Scheme interpreter automatically looks for a variable binding in the containing environment if it doesn't find one in the local environment. More generally, every environment except for the top level one has a reference to its containing environment, and the interpreter keeps searching back up the chain of environments -- from most local to top level -- until it either finds a variable binding for the required identifier or exhausts the chain.

Ответ состоит в том, что локальное окружение, созданное выражением let автоматически имеет ссылку на внешнее окружение (в данном случае это окружение верхнего уровня), и это заставляет интерпретатор Scheme продолжать поиск привязки переменной в внешнем окружении, если не удалось найти привязку в локальном окружении. Более обще: каждое окружение (кроме окружения верхнего уровня) имеет ссылку на внешнее окружение. Интерпретатор продолжает поиск по восходящей цепочке окружений (с самого локального до вернего уровня) до тех пор, пока не найдёт искомую привязку или не закончится цепочка окружений.

This description also determines what happens when there is more than one variable binding with the same name. Suppose, continuing the example of the previous subsection, that there was also a pre-existing top level variable s created by the expression:

В этом описании заодно определено, что происходит, когда присутствует более одной привязки переменных с одним и тем же именем. Допустим (продолжая предыдущий пример), что у нас есть ранее заданная переменная верхнего уровня s, созданная при помощи выражения:

(define s "Some beans, my lord!")

Then both the top level environment and the local let environment would contain bindings for the name s. When evaluating code within the let body, the interpreter looks first in the local let environment, and so finds the binding for s created by the let syntax. Even though this environment has a reference to the top level environment, which also has a binding for s, the interpreter doesn't get as far as looking there. When evaluating code outside the let body, the interpreter looks up variable names in the top level environment, so the name s refers to the top level variable.

И окружение верхнего уровня, и локальное окружение let будут содержать привязки для имени s. В процессе вычисления внутри тела let интерпретатор сначала ищет в локальном окружении let, и находит привязку для s, созданную let. Несмотря на то, что это окружение имеет ссылку на окружение верхнего уровня, в котором так же есть привязка для s, интерпретатор не будет искать так далеко. В процессе вычисления кода за пределами тела let, интерпретатор ищет переменные в окружении верхнего уровня, так что имя s будет ссылаться на переменную верхнего уровня.

Within the let body, the binding for s in the local environment is said to shadow the binding for s in the top level environment.

В коде тела let, привязка для s в локальном окружении затеняет (shadow) привязку для s в окружении верхнего уровня.


> > далее > >