|
||||
Меню:
Главная
Форум
Литература: Программирование и ремонт Импульсные блоки питания Неисправности и замена Радиоэлектронная аппаратура Микросхема в ТА Рубрикатор ТА Кабельные линии Обмотки и изоляция Радиоаппаратура Гибкие диски часть 2 часть 3 часть 4 часть 5 Ремонт компьютера часть 2 Аналитика: Монтаж Справочник Электроника Мощные высокочастотные транзисторы 200 микросхем Полупроводники ч.1 Часть 2 Алгоритмические проблемы 500 микросхем 500 микросхем Сортировка и поиск Монады Передача сигнала Электроника Прием сигнала Телевидиние Проектирование Эвм Оптимизация Автомобильная электроника Поляковтрансиверы Форт Тензодатчик Силовые полевые транзисторы Распределение частот Резисторные и термопарные Оберон Открытые системы шифрования Удк |
[55] конструкторы, позволяет нам до последнего момента отложить выбор конкретного представления для наших объектов данных, и таким образом сохранить максимальную гибкость в проекте нашей системы. Принцип наименьших обязательств можно довести до еще больших крайностей. Если нам понадобится, мы можем сохранить неопределенность представления даже после того, как мы спроектировали селекторы и конструкторы, и использовать и представление Бена, и представление Лизы. Однако если оба представления участвуют в одной и той же системе, нам потребуется какой-нибудь способ отличить данные в полярной форме от данных в декартовой форме. Иначе, если нас попросят, например, вычислить magnitude от пары (3,4), мы не будем знать, надо ли ответить 5 (интерпретируя число в декартовой форме) или 3 (интерпретируя его в полярной форме). Естественный способ добиться необходимого различия состоит в том, чтобы использовать метку типа (type tag) - символ rectangular или polar - как часть каждого комплексного числа. Тогда, когда нам понадобится что-то делать с комплексным числом, мы можем при помощи этой метки решить, который селектор требуется применить. Чтобы работать с помеченными данными, мы предположим, что у нас есть процедуры type-tag и contents, которые извлекают из элемента данных метку и собственно содержимое (полярные либо декартовы координаты, если речь идет о комплексном числе). Кроме того, мы постулируем процедуру attach-tag, которая берет метку и содержимое, и выдает помеченный объект данных. Простейший способ реализовать эти процедуры - использовать обыкновенную списковую структуру: (define (attach-tag type-tag contents) (cons type-tag contents)) (define (type-tag datum) (if (pair? datum) (car datum) (error "Некорректные помеченные данные -- TYPE-TAG" datum))) (define (contents datum) (if (pair? datum) (cdr datum) (error "Некорректные помеченные данные -- CONTENTS" datum))) При помощи этих процедур мы можем определить предикаты rectangular? и polar?, которые распознают, соответственно, декартово и полярное представление: (define (rectangular? z) (eq? (type-tag z) rectangular)) (define (polar? z) (eq? (type-tag z) polar)) Теперь, когда у нас имеются метки типов, Бен и Лиза могут переделать свой код так, чтобы позволить своим разнородным представлениям сосуществовать в одной и той же системе. Каждый раз, когда Бен создает комплексное число, он помечает его как декартово. Каждый раз, когда Лиза создает комплексное число, она помечает его как полярное. В дополнение к этому, Бен и Лиза должны сделать так, чтобы не было конфликта имен между названиями их процедур. Один из способов добиться этого - Бену добавить слово rectangular к названиям всех своих процедур представления данных, а Лизе добавить polar к своим. Вот переработанное декартово представление Бена из раздела 2.4.1: (define (real-part-rectangular z) (car z)) (define (imag-part-rectangular z) (cdr z)) (define (magnitude-rectangular z) (sqrt (+ (square (real-part-rectangular z)) (square (imag-part-rectangular z))))) (define (angle-rectangular z) (atan (imag-part-rectangular z) (real-part-rectangular z))) (define (make-from-real-imag-rectangular x y) (attach-tag rectangular (cons x y))) (define (make-from-mag-ang-rectangular r a) (attach-tag rectangular (cons (* r (cos a)) (* r (sin a))))) а вот переработанное полярное представление Лизы: (define (real-part-polar z) (* (magnitude-polar z) (cos (angle-polar z)))) (define (imag-part-polar z) (* (magnitude-polar z) (sin (angle-polar z)))) (define (magnitude-polar z) (car z)) (define (angle-polar z) (cdr z)) (define (make-from-real-imag-polar x y) (attach-tag polar (cons (sqrt (+ (square x) (square y))) (atan y x)))) (define (make-from-mag-ang-polar r a) (attach-tag polar (cons r a))) Каждый обобщенный селектор реализуется как процедура, которая проверяет метку своего аргумента и вызывает подходящую процедуру для обработки данных нужного типа. Например, для того, чтобы получить действительную часть комплексного числа, real-part смотрит на метку и решает, звать ли Бенову real-part-rectangular или Лизину real-part-polar. В каждом из этих случаев мы пользуемся процедурой contents, чтобы извлечь голый, непомеченный элемент данных и передать его либо в декартову, либо в полярную процедуру: (define (real-part z) (cond ((rectangular? z) (real-part-rectangular (contents z))) ((polar? z) (real-part-polar (contents z))) (else (error "Неизвестный тип -- REAL-PART" z)))) (imag-part z) ((rectangular? z) (imag-part-rectangular (contents z))) ((polar? z) (imag-part-polar (contents z))) (else (error "Неизвестный тип - IMAG-PART" z)))) (magnitude z) ((rectangular? z) (magnitude-rectangular (contents z))) ((polar? z) (magnitude-polar (contents z))) (else (error "Неизвестный тип - MAGNITUDE" z)))) (angle z) ((rectangular? z) (angle-rectangular (contents z))) ((polar? z) (angle-polar (contents z))) (else (error "Неизвестный тип -- ANGLE" z)))) Для реализации арифметических операций с комплексными числами мы по-прежнему можем использовать старые процедуры add-complex, sub-complex, mul-complex и div-complex из раздела 2.4.1, поскольку вызываемые ими селекторы обобщенные и, таким образом, могут работать с любым из двух представлений. Например, процедура add-complex по-прежнему выглядит как (define (add-complex zl z2) (make-from-real-imag (+ (real-part zl) (real-part z2)) (+ (imag-part zl) (imag-part z2)))) Наконец, нам надо решить, порождать ли комплексные числа в Беновом или Лизином представлении. Одно из разумных решений состоит в том, чтобы порождать декартовы числа, когда нам дают действительную и мнимую часть, и порождать полярные числа, когда нам дают модуль и аргумент: (define (make-from-real-imag x y) (make-from-real-imag-rectangular x y)) (define (make-from-mag-ang r a) (make-from-mag-ang-polar r a)) Структура получившейся системы комплексной арифметики показана на рисунке 2.21. Система разбита на три относительно независимых части: операции арифметики комплексных чисел, полярная реализация Лизы и декартова реализация Бена. Полярная и декартова реализации могли быть написаны Беном и Лизой по отдельности, и любую из них может использовать в качестве внутреннего представления третий программист, чтобы реализовать процедуры арифметики комплексных чисел в терминах абстрактного интерфейса конструкторов и селекторов. (define (cond (define (cond (define (cond |
Среды: 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 | ||