|
||||
Меню:
Главная
Форум
Литература: Программирование и ремонт Импульсные блоки питания Неисправности и замена Радиоэлектронная аппаратура Микросхема в ТА Рубрикатор ТА Кабельные линии Обмотки и изоляция Радиоаппаратура Гибкие диски часть 2 часть 3 часть 4 часть 5 Ремонт компьютера часть 2 Аналитика: Монтаж Справочник Электроника Мощные высокочастотные транзисторы 200 микросхем Полупроводники ч.1 Часть 2 Алгоритмические проблемы 500 микросхем 500 микросхем Сортировка и поиск Монады Передача сигнала Электроника Прием сигнала Телевидиние Проектирование Эвм Оптимизация Автомобильная электроника Поляковтрансиверы Форт Тензодатчик Силовые полевые транзисторы Распределение частот Резисторные и термопарные Оберон Открытые системы шифрования Удк |
[76] глобальное окружение параметры: amount тело: Рис. 3.10: Создание второго объекта при помощи (define W2 (make-withdraw 100)) (let (((пер) (выр))) (тело)) интерпретируется как альтернативный синтаксис для ((lambda ((пер)) (тело)) (выр)) С помощью модели с окружениями проанализируйте альтернативную версию make-withraw. Нарисуйте картинки, подобные приведенным в этом разделе, для выражений (define W1 (make-withdraw 100)) (W1 50) (define W2 (make-withdraw 100)) Покажите, что две версии make-withdraw создают объекты с одинаковым поведением. Как различаются структуры окружений в двух версиях? 3.2.4 Внутренние определения В разделе 1.1.8 мы познакомились с идеей, что процедуры могут содержать внутренние определения, в результате чего возникает блочная структура, как, например, в следующей процедуре вычисления квадратного корня: (define (sqrt x) (define (good-enough? guess) (< (abs (- (square guess) x)) 0.001)) (define (improve guess) (average guess (/ x guess))) (define (sqrt-iter guess) (if (good-enough? guess) guess (sqrt-iter (improve guess)))) (sqrt-iter 1.0)) глобальное окружение sqrtu ее x:2 good-enough?:-, improve:... sqrt-iter:... Е1-Ц параметры: x тело: (define good-enough? ...) (define improve ...) (define sqrt-iter ...) (sqrt-iter 1.0)- ее Е2з4 guess:1 параметры: guess вызов sqrt-iter тело: (< (abs ...) ...) E3 -s4 guess:1 вызов good-enough? Рис. 3.11: Процедура sqrt с внутренними определениями. Теперь с помощью модели с окружениями мы можем увидеть, почему эти внутренние определения работают так, как должны. На рисунке 3.11 изображен момент во время вычисления выражения (sqrt 2) , когда внутренняя процедура good-enough? вызвана в первый раз со значением guess, равным 1. Рассмотрим структуру окружения. Символ sqrt в глобальном окружении связан с процедурным объектом, ассоциированное окружение которого - глобальное окружение. Когда мы вызвали процедуру sqrt, появилось окружение E1, зависимое от глобального, в котором параметр x связан со значением 2. Затем мы вычислили тело sqrt внутри E1. Поскольку первое выражение в теле sqrt есть (define (good-enough? guess) (< (abs (- (square guess) x)) 0.001)) вычисление этого выражения привело к определению процедуры good-enough? в окружении E1. Выражаясь более точно, к первому кадру E1 был добавлен символ good-enough?, связанный с процедурным объектом, ассоциированным окружением которого является E1. Подобным образом в качестве процедур внутри E1 были определены improve и sqrt-iter. Краткости ради на рис. 3.11 показан только процедурный объект, соответствующий good-enough?. После того, как были определены внутренние процедуры, мы вычислили выражение (sqrt-iter 1.0), по-прежнему в окружении E1. То есть, процедурный объект, связанный в E1 с именем sqrt-iter, был вызван с аргументом 1. При этом появилось окружение E2, в котором guess, параметр sqrt-iter, связан со значением 1. В свою очередь, sqrt-iter вызвала good-enough? со значением guess (из E2) в качестве аргумента. Получилось еще одно окру- жение, E3, в котором guess (параметр good-enough?) связан со значением 1. Несмотря на то, что и sqrt-iter, и good-enough? имеют по параметру с одинаковым именем guess, это две различные переменные, расположенные в разных кадрах. Кроме того, и E2, и E3 в качестве объемлющего окружения имеют E1, поскольку как sqrt-iter, так и good-enough? в качестве окружения содержат указатель на E1. Одним из следствий этого является то, что символ x в теле good-enough? обозначает связывание x, в окружении E1, а точнее, то значение x, с которым была вызвана исходная процедура sqrt. Таким образом, модель вычислений с окружениями объясняет две ключевых особенности, которые делают внутренние определения процедур полезным способом модуляризации программ: •Имена внутренних процедур не путаются с именами, внешними по отношению к охватывающей процедуре, поскольку локальные имена процедур будут связываться в кадре, который процедура создает при своем запуске, а не в глобальном окружении. •Внутренние процедуры могут обращаться к аргументам охватывающих процедур, просто используя имена параметров как свободные переменные. Это происходит потому, что тело внутренней процедуры выполняется в окружении, подчиненном окружению, где вычисляется объемлющая процедура. Упражнение 3.11. В разделе 3.2.3 мы видели, как модель с окружениями описывает поведение процедур, обладающих внутренним состоянием. Теперь мы рассмотрели, как работают локальные определения. Типичная процедура с передачей сообщений пользуется и тем, и другим. Рассмотрим процедуру моделирования банковского счета из раздела 3.1.1: (define (make-account balance) (define (withdraw amount) (if (>= balance amount) (begin (set! balance (- balance amount)) balance) "Недостаточно денег на счете")) (define (deposit amount) (set! balance (+ balance amount)) balance) (define (dispatch m) (cond ((eq? m withdraw) withdraw) ((eq? m deposit) deposit) (else (error "Неизвестный вызов -- MAKE-ACCOUNT" m)))) dispatch) Покажите, какая структура окружений создается последовательностью действий (define acc (make-account 50)) ((acc deposit) 40) 90 ((acc withdraw) 60) 30 Где хранится внутреннее состояние acc? Предположим, что мы определяем еще один счет |
Среды: Smalltalk80 MicroCap Local bus Bios Pci 12С ML Микроконтроллеры: Atmel Intel Holtek AVR MSP430 Microchip Книги: Емкостный датчик 500 схем для радиолюбителей часть 2 (4) Структура компьютерных программ Автоматическая коммутация Кондиционирование и вентиляция Ошибки при монтаже Схемы звуковоспроизведения Дроссели для питания Блоки питания Детекторы перемещения Теория электропривода Адаптивное управление Измерение параметров Печатная плата pcad pcb Физика цвета Управлении софтверными проектами Математический аппарат Битовые строки Микроконтроллер nios Команды управления выполнением программы Перехода от ahdl к vhdl Холодный спай Усилители hi-fi Электронные часы Сердечники из распылённого железа Анализ алгоритмов 8-разрядные КМОП Классификация МПК История Устройства автоматики Системы и сети Частотность Справочник микросхем Вторичного электропитания Типы видеомониторов Радиобиблиотека Электронные системы Бесконтекстный язык Управление техническими системами Монтаж печатных плат Работа с коммуникациями Создание библиотечного компонента Нейрокомпьютерная техника Parser Пи-регулятор ч.1 ПИ-регулятор ч.2 Обработка списков Интегральные схемы Шина ISAВ Шина PCI Прикладная криптография Нетематическое: Взрывной автогидролиз Нечеткая логика Бытовые установки (укр) Автоматизация проектирования Сбор и защита Дискретная математика Kb радиостанция Энергетика Ретро: Прием в автомобиле Управление шаговым двигателем Магнитная запись Ремонт микроволновки Дискретные системы часть 2 | ||