|
||||
Меню:
Главная
Форум
Литература: Программирование и ремонт Импульсные блоки питания Неисправности и замена Радиоэлектронная аппаратура Микросхема в ТА Рубрикатор ТА Кабельные линии Обмотки и изоляция Радиоаппаратура Гибкие диски часть 2 часть 3 часть 4 часть 5 Ремонт компьютера часть 2 Аналитика: Монтаж Справочник Электроника Мощные высокочастотные транзисторы 200 микросхем Полупроводники ч.1 Часть 2 Алгоритмические проблемы 500 микросхем 500 микросхем Сортировка и поиск Монады Передача сигнала Электроника Прием сигнала Телевидиние Проектирование Эвм Оптимизация Автомобильная электроника Поляковтрансиверы Форт Тензодатчик Силовые полевые транзисторы Распределение частот Резисторные и термопарные Оберон Открытые системы шифрования Удк |
[59] (lambda (x y) (tag (- x y)))) (put mul (scheme-number scheme-number) (lambda (x y) (tag (* x y)))) (put div (scheme-number scheme-number) (lambda (x y) (tag (/ x y)))) (put make scheme-number (lambda (x) (tag x))) done) Пользователи пакета Схемных чисел будут создавать (помеченные) элементарные числа с помощью процедуры (define (make-scheme-number n) ((get make scheme-number) n)) Теперь, когда каркас обобщенной арифметической системы построен, мы можем без труда добавлять новые типы чисел. Вот пакет, который реализует арифметику рациональных чисел. Обратите внимание, что благодаря аддитивности мы можем без изменений использовать код рациональной арифметики из раздела 2.1.1 в виде внутренних процедур пакета: (define (install-rational-package) ;; внутренние процедуры (define (numer x) (car x)) (define (denom x) (cdr x)) (define (make-rat n d) (let ((g (gcd n d))) (cons (/ n g) (/ d g)))) (define (add-rat x y) (make-rat (+ (* (numer x) (denom y)) (* (numer y) (denom x))) (* (denom x) (denom y)))) (define (sub-rat x y) (make-rat (- (* (numer x) (denom y)) (* (numer y) (denom x))) (* (denom x) (denom y)))) (define (mul-rat x y) (make-rat (* (numer x) (numer y)) (* (denom x) (denom y)))) (define (div-rat x y) (make-rat (* (numer x) (denom y)) (* (denom x) (numer y)))) ;; интерфейс к остальной системе (define (tag x) (attach-tag rational x)) (put add (rational rational) (lambda (x y) (tag (add-rat x y)))) (put sub (rational rational) (lambda (x y) (tag (sub-rat x y)))) (put mul (rational rational) (lambda (x y) (tag (mul-rat x y)))) (put div (rational rational) (lambda (x y) (tag (div-rat x y)))) (put make rational (lambda (n d) (tag (make-rat n d)))) done) (define (make-rational n d) ((get make rational) n d)) Мы можем установить подобный пакет и для комплексных чисел, используя метку complex. При создании пакета мы извлекаем из таблицы операции make-from-real-imag и make-from-mag-ang, определенные в декартовом и полярном пакетах. Аддитивность позволяет нам использовать без изменений в качестве внутренних операций процедуры add-complex, sub-complex, mul-complex и div-complex из раздела 2.4.1. (define (install-complex-package) ;; процедуры, импортируемые из декартова ;; и полярного пакетов (define (make-from-real-imag x y) ((get make-from-real-imag rectangular) x y)) (define (make-from-mag-ang r a) ((get make-from-mag-ang polar) r a)) ;; внутренние процедуры (define (add-complex zl z2) (make-from-real-imag (+ (real-part zl) (+ (imag-part zl) (define (sub-complex z1 z2) (make-from-real-imag (- (real-part zl) (- (imag-part zl) (define (mul-complex (make-from-mag-ang (real-part (imag-part (real-part (imag-part z2)) z2)))) z2)) z2)))) (define (div-complex (make-from-mag-ang zl (+ zl (- z2) (magnitude (angle zl) z2) (magnitude (angle zl) zl) (magnitude z2)) (angle z2)))) zl) (magnitude z2)) (angle z2)))) ;; интерфейс к остальной системе (define (tag z) (attach-tag complex z)) (put add (complex complex) (lambda (zl z2) (tag (add-complex zl z2)))) (put sub (complex complex) (lambda (zl z2) (tag (sub-complex zl z2)))) (put mul (complex complex) (lambda (zl z2) (tag (mul-complex zl z2)))) (put div (complex complex) (lambda (zl z2) (tag (div-complex zl z2)))) (put make-from-real-imag complex (lambda (x y) (tag (make-from-real-imag x y)))) (put make-from-mag-ang complex (lambda (r a) (tag (make-from-mag-ang r a)))) done) Вне комплексного пакета программы могут создавать комплексные числа либо из действительной и мнимой части, либо из модуля и аргумента. Обратите внимание, как нижележащие процедуры, которые были изначально определены в декартовом и полярном пакете, экспортируются в комплексный пакет, а оттуда во внешний мир. complex rectangular 3 4 Рис. 2.24: Представление 3 + 4i в декартовой форме. (define (make-complex-from-real-imag x y) ((get make-from-real-imag complex) x y)) (define (make-complex-from-mag-ang r a) ((get make-from-mag-ang complex) r a)) Здесь мы имеем двухуровневую систему меток. Типичное комплексное число, например 3 + 4i в декартовой форме, будет представлено так, как показано на рисунке 2.24. Внешняя метка (complex) используется, чтобы отнести число к пакету комплексных чисел. Внутри комплексного пакета вторая метка (rectangular) относит число к декартову пакету. В большой и сложной системе может быть несколько уровней, каждый из которых связан со следующим при помощи обобщенных операций. Когда объект данных передается «вниз», внешняя метка, которая используется для отнесения к нужному пакету, отрывается (при помощи вызова contents), и следующий уровень меток (если таковой имеется) становится доступным для дальнейшей диспетчеризации. В приведенных пакетах мы использовали add-rat, add-complex и другие арифметические процедуры ровно в таком виде, как они были написаны с самого начала. Но когда эти определения оказываются внутри различных процедур установки, отпадает необходимость давать им различные имена: мы могли бы просто назвать их в обоих пакетах add, sub, mul и div. Упражнение 2.77. Хьюго Дум пытается вычислить выражение (magnitude z), где z - объект, показанный на рис.2.24. К своему удивлению, вместо ответа 5 он получает сообщение об ошибке от apply-generic, гласящее, что у операции magnitude нет методов для типа (complex). Он показывает результат Лизе П. Хакер. Та заявляет: "Дело в том, что селекторы комплексных чисел для чисел с меткой complex определены не были, а были только для чисел с меткой polar и rectangular. Все, что требуется, чтобы заставить это работать - это добавить к пакету complex следующее:" (put real-part (complex) real-part) (put imag-part (complex) imag-part) (put magnitude (complex) magnitude) (put angle (complex) angle) Подробно опишите, почему это работает. В качестве примера, проследите все процедуры, которые вызываются при вычислении (magnitude z) , где z - объект, показанный на рис.2.24. В частности, сколько раз вызывается apply-generic? На какую процедуру она диспетчирует в каждом случае? Упражнение 2.78. В пакете scheme-number внутренние процедуры, в сущности, ничего не делают, только вызывают элементарные процедуры +, -, и т.д. Прямо использовать примитивы языка |
Среды: 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 | ||