Ремонт принтеров, сканнеров, факсов и остальной офисной техники


назад Оглавление вперед




[73]

• Для того, чтобы вычислить комбинацию, нужно:

-Вычислить подвыражения комбинации.12

-Применить значение выражения-оператора к значениям выражений-операндов.

Модель вычисления с окружениями заменяет подстановочную модель, по-своему определяя, что значит применить составную процедуру к аргументам.

В модели вычисления с окружениями процедура всегда представляется в виде пары, состоящей из кода и указателя на некое окружение. Процедура создается единственным способом: вычислением lambda-выражения. Такое вычисление дает в качестве результата процедуру, код которой берется из тела lambda-выражения, а окружение совпадает с окружением, в котором было вычислено выражение, чьим значением является процедура. Например, рассмотрим определение процедуры

(define (square x) (* x x))

которое вычисляется в глобальном окружении. Синтаксис определения процедуры - всего лишь синтаксический сахар для подразумеваемой lambda. С тем же успехом можно было написать выражение

(define square

(lambda (x) (* x x)))

которое вычисляет (lambda (x) (* x x)) и связывает символ square с полученным значением, все это в глобальном окружении.

Рис. 3.2 показывает результат вычисления lambda-выражения. Объект-процедура представляет собой пару, код которой указывает, что процедура принимает один формальный параметр, а именно x, а тело ее (* x x). Окружение процедуры - это указатель на глобальное окружение, поскольку именно в нем вычислялось lambda-выражение, при помощи которого процедура была порождена. К глобальному кадру добавилось новое связывание, которое сопоставляет процедурный объект символу square. В общем случае define создает определения, добавляя новые связывания в кадры.

Теперь, когда мы рассмотрели, как процедуры создаются, мы можем описать, как они применяются. Модель с окружениями говорит: чтобы применить процедуру к аргументам, создайте новое окружение, которое содержит кадр, связывающий параметры со значениями аргументов. Объемлющим окружением для нового кадра служит окружение, на которое указывает процедура. Теперь требуется выполнить тело процедуры в этом новом окружении.

Чтобы проиллюстрировать, как работает это новое правило, на рис. 3.3 показана структура окружений, которая создается при вычислении выражения

12Присваивание вносит одну тонкость в шаг 1 правила вычисления. Как показано в упражнении 3.8, присваивание позволяет нам писать выражения, которые имеют различные значения в зависимости от того, в каком порядке вычисляются подвыражения комбинации. Таким образом, чтобы быть точными, мы должны были бы указать порядок вычислений на шаге 1 (например, слева направо или справа налево). Однако этот порядок всегда должен рассматриваться как деталь реализации, и писать программы, которые зависят от порядка вычисления аргументов, не следует. К примеру, продвинутый компилятор может оптимизировать программу, изменяя порядок, в котором вычисляются подвыражения.


глобальное

окружение"

другие переменные square: -,

(define (square x)

(* x x))

параметры: x тело: (* x x)

Рис. 3.2: Структура окружений, порождаемая вычислением (define (square x) (* x x)) в глобальном окружении.

глобальное -

окружение

(square 5)

параметры: x тело: (* x x)

(* x x)

Рис. 3.3: Окружение, создаваемое при вычислении (square 5) в глобальном окружении.

(square 5) в глобальном окружении, если square - процедура, порожденная на рисунке 3.2. Применение процедуры приводит к созданию нового окружения, которое на рисунке обозначено как E1, и это окружение начинается с кадра, в котором x, формальный параметр процедуры, связан с аргументом 5. Указатель, который ведет из этого кадра вверх, показывает, что объемлющим для этого окружения является глобальное. Глобальное окружение выбирается потому, что именно на него ссылается процедурный объект square. Внутри E1 мы вычисляем тело процедуры, (* x x) . Поскольку значение x в E1 равно 5, результатом будет (* 5 5) , или 25.

Модель вычисления с окружениями можно вкратце описать двумя правилами:

• Процедурный объект применяется к набору аргументов при помощи создания кадра, связывания формальных параметров процедуры с аргументами вызова, и, наконец, вычисления тела процедуры в контексте этого свежесо-зданного окружения. В качестве объемлющего окружения новый кадр имеет окружение, содержащееся в применяемом процедурном объекте.


• Процедура создается при вычислении lambda-выражения по отношению к некоторому окружению. Получающийся процедурный объект есть пара, состоящая из текста lambda-выражения и указателя на окружение, в котором процедура была создана.

Кроме того, мы указываем, что когда символ определяется при помощи define, в текущем кадре окружения создается связывание, и символу присваивается указанное значение.13 Наконец, мы описываем поведение set!, операции, из-за которой нам, собственно, и пришлось ввести модель с окружениями. Вычисление выражения (set! (переменная) (значение)) в некотором окружении заставляет интерпретатор найти связывание переменной в окружении и изменить это связывание так, чтобы оно указывало на новое значение. А именно, нужно найти первый кадр окружения, в котором содержится связывание для переменной, и изменить этот кадр. Если переменная в окружении не связана, set! сигнализирует об ошибке.

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

3.2.2 Применение простых процедур

Когда в разделе 1.1.5 мы описывали подстановочную модель, мы показали, как вычисление комбинации (f 5) дает результат 136, если даны следующие определения:

(define (square x) (* x x))

(define (sum-of-squares x y) (+ (square x) (square y)))

(define (f a)

(sum-of-squares (+ai) (* a 2)))

Теперь мы можем проанализировать тот же самый пример, используя модель с окружениями. На рисунке 3.4 изображены три процедурных объекта, созданные вычислением в глобальном окружении определений f, square, и sum-of-squares . Каждый процедурный объект состоит из куска кода и указателя на глобальное окружение.

На рисунке 3.5 мы видим структуру окружений, созданную вычислением выражения (f 5). Вызов f создает новое окружение E1, начинающееся с кадра, в

13Если в текущем кадре уже имелось связывание для указанной переменной, то это связывание изменяется. Это правило удобно, поскольку позволяет переопределять символы; однако оно означает, что при помощи define можно изменять значение символов, а это влечет за собой все проблемы, связанные с присваиванием, без явного использования set! . По этой причине некоторые предпочитают, чтобы переопределение существующего символа вызывало предупреждение или сообщение об ошибке.



[стр.Начало] [стр.1] [стр.2] [стр.3] [стр.4] [стр.5] [стр.6] [стр.7] [стр.8] [стр.9] [стр.10] [стр.11] [стр.12] [стр.13] [стр.14] [стр.15] [стр.16] [стр.17] [стр.18] [стр.19] [стр.20] [стр.21] [стр.22] [стр.23] [стр.24] [стр.25] [стр.26] [стр.27] [стр.28] [стр.29] [стр.30] [стр.31] [стр.32] [стр.33] [стр.34] [стр.35] [стр.36] [стр.37] [стр.38] [стр.39] [стр.40] [стр.41] [стр.42] [стр.43] [стр.44] [стр.45] [стр.46] [стр.47] [стр.48] [стр.49] [стр.50] [стр.51] [стр.52] [стр.53] [стр.54] [стр.55] [стр.56] [стр.57] [стр.58] [стр.59] [стр.60] [стр.61] [стр.62] [стр.63] [стр.64] [стр.65] [стр.66] [стр.67] [стр.68] [стр.69] [стр.70] [стр.71] [стр.72] [стр.73] [стр.74] [стр.75] [стр.76] [стр.77] [стр.78] [стр.79] [стр.80] [стр.81] [стр.82] [стр.83] [стр.84] [стр.85] [стр.86] [стр.87] [стр.88] [стр.89] [стр.90] [стр.91] [стр.92] [стр.93] [стр.94] [стр.95] [стр.96] [стр.97] [стр.98] [стр.99] [стр.100] [стр.101] [стр.102] [стр.103] [стр.104] [стр.105] [стр.106] [стр.107] [стр.108] [стр.109] [стр.110] [стр.111] [стр.112] [стр.113] [стр.114] [стр.115] [стр.116] [стр.117] [стр.118] [стр.119] [стр.120] [стр.121] [стр.122] [стр.123] [стр.124] [стр.125] [стр.126] [стр.127] [стр.128] [стр.129] [стр.130] [стр.131] [стр.132] [стр.133] [стр.134] [стр.135] [стр.136] [стр.137] [стр.138] [стр.139] [стр.140] [стр.141] [стр.142] [стр.143] [стр.144] [стр.145] [стр.146] [стр.147] [стр.148] [стр.149] [стр.150] [стр.151] [стр.152] [стр.153] [стр.154] [стр.155] [стр.156] [стр.157] [стр.158] [стр.159] [стр.160] [стр.161] [стр.162] [стр.163] [стр.164] [стр.165] [стр.166] [стр.167] [стр.168] [стр.169] [стр.170] [стр.171] [стр.172] [стр.173] [стр.174] [стр.175] [стр.176] [стр.177] [стр.178] [стр.179] [стр.180] [стр.181] [стр.182] [стр.183] [стр.184] [стр.185] [стр.186] [стр.187] [стр.188] [стр.189] [стр.190] [стр.191] [стр.192] [стр.193] [стр.194] [стр.195] [стр.196]