|
||||
Меню:
Главная
Форум
Литература: Программирование и ремонт Импульсные блоки питания Неисправности и замена Радиоэлектронная аппаратура Микросхема в ТА Рубрикатор ТА Кабельные линии Обмотки и изоляция Радиоаппаратура Гибкие диски часть 2 часть 3 часть 4 часть 5 Ремонт компьютера часть 2 Аналитика: Монтаж Справочник Электроника Мощные высокочастотные транзисторы 200 микросхем Полупроводники ч.1 Часть 2 Алгоритмические проблемы 500 микросхем 500 микросхем Сортировка и поиск Монады Передача сигнала Электроника Прием сигнала Телевидиние Проектирование Эвм Оптимизация Автомобильная электроника Поляковтрансиверы Форт Тензодатчик Силовые полевые транзисторы Распределение частот Резисторные и термопарные Оберон Открытые системы шифрования Удк |
[57] совпадают с конструкторами, которые Бен определяет для себя, но вдобавок прикрепляют метку. Лизин полярный пакет устроен аналогично: (define (install-polar-package) ;; внутренние процедуры (define (magnitude z) (car z)) (define (angle z) (cdr z)) (define (make-from-mag-ang r a) (cons r a)) (define (real-part z) (* (magnitude z) (cos (angle z)))) (define (imag-part z) (* (magnitude z) (sin (angle z)))) (define (make-from-real-imag x y) (cons (sqrt (+ (square x) (square y))) (atan y x))) ;; интерфейс к остальной системе (define (tag x) (attach-tag polar x)) (put real-part (polar) real-part) (put imag-part (polar) imag-part) (put magnitude (polar) magnitude) (put angle (polar) angle) (put make-from-real-imag polar (lambda (x y) (tag (make-from-real-imag x y)))) (put make-from-mag-ang polar (lambda (r a) (tag (make-from-mag-ang r a)))) done) Несмотря на то, что Бен и Лиза используют свои исходные процедуры с совпадающими именами (например, real-part), эти определения теперь внутренние для различных процедур (см. раздел 1.1.8), так что никакого конфликта имен не происходит. Селекторы комплексной арифметики обращаются к таблице посредством общей процедуры-«операции» apply-generic, которая применяет обобщенную операцию к набору аргументов. Apply-generic ищет в таблице ячейку по имени операции и типам аргументов и применяет найденную процедуру, если 47 она существует:47 (define (apply-generic op . args) (let ((type-tags (map type-tag args))) (let ((proc (get op type-tags))) (if proc (apply proc (map contents args)) 47Apply-generic пользуется точечной записью, описанной в упражнении 2.20, поскольку различные обобщенные операции могут принимать различное число аргументов. В apply-generic значением op является первый аргумент вызова apply-generic, а значением args список остальных аргументов. Кроме того, apply-generic пользуется элементарной процедурой apply, которая принимает два аргумента: процедуру и список. Apply вызывает процедуру, используя элементы списка как аргументы. Например, (apply + (list 12 3 4)) возвращает 10. (error "Нет метода для этих типов - APPLY-GENERIC" (list op type-tags)))))) При помощи apply-generic можно определить обобщенные селекторы так: (define (real-part z) (apply-generic real-part z)) (define (imag-part z) (apply-generic imag-part z)) (define (magnitude z) (apply-generic magnitude z)) (define (angle z) (apply-generic angle z)) Заметим, что они не изменяются, если в систему добавляется новое представление. Кроме того, мы можем из той же таблицы получать конструкторы, которые будут использоваться программами, внешними по отношению к пакетам, для изготовления комплексных чисел из действительной и мнимой части либо из модуля и аргумента. Как и в разделе 2.4.2, мы порождаем декартово представление, если нам дают действительную и мнимую часть, и полярное, если дают модуль и аргумент: (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)) Упражнение 2.73. В разделе 2.3.2 описывается программа, которая осуществляет символьное дифференцирование: (define (deriv exp var) (cond ((number? exp) 0) ((variable? exp) (if (same-variable? exp var) 1 0)) ((sum? exp) (make-sum (deriv (addend exp) var) (deriv (augend exp) var))) ((product? exp) (make-sum (make-product (multiplier exp) (deriv (multiplicand exp) var)) (make-product (deriv (multiplier exp) var) (multiplicand exp)))) (здесь можно добавить еще правила) (else (error "неизвестный тип выражения -- DERIV" exp)))) Можно считать, что эта программа осуществляет диспетчеризацию по типу выражения, которое требуется продифференцировать. В этом случае «меткой типа» элемента данных является символ алгебраической операции (например, +), а операция, которую нужно применить - deriv. Эту программу можно преобразовать в управляемый данными стиль, если переписать основную процедуру взятия производной в виде (define (deriv exp var) (cond ((number? exp) 0) ((variable? exp) (if (same-variable? exp var) 1 0)) (else ((get deriv (operator exp)) (operands exp) var)))) (define (operator exp) (car exp)) (define (operands exp) (cdr exp)) a.Объясните, что происходит в приведенном фрагменте кода. Почему нельзя включить в операцию выбора, управляемого данными, предикаты number? и variable?? b.Напишите процедуры для вычисления производных от суммы и произведения, а также дополнительный код, чтобы добавить их к таблице, которой пользуется приведенный фрагмент. c.Выберите еще какое-нибудь правило дифференцирования, например для возведения в степень (упражнение 2.56), и установите его в систему. d.В этой простой алгебраической системе тип выражения - это алгебраическая операция верхнего уровня. Допустим, однако, что мы индексируем процедуры противоположным образом, так что строка диспетчеризации в deriv выглядит как ((get (operator exp) deriv) (operands exp) var) Какие изменения потребуются в системе дифференцирования? Упражнение 2.74. Insatiable Enterprises, Inc. - децентрализованная компания-конгломерат, которая состоит из большого количества независимых подразделений, раскиданных по всему миру. Недавно вычислительные мощности компании были связаны умной вычислительной сетью, создающей для пользователя иллюзию, что он работает с единым компьютером. Президент компании, когда она в первый раз пытается воспользоваться способностью системы осуществлять доступ к файлам подразделений, с изумлением и ужасом обнаруживает, что, несмотря на то, что все эти файлы реализованы в виде структур данных на Scheme, конкретная структура данных отличается от подразделения к подразделению. Спешно созывается совещание менеджеров подразделений, чтобы найти стратегию, которая позволила бы собрать файлы в единую систему для удовлетворения нужд главного офиса, и одновременно сохранить существующую автономию подразделений. Покажите, как такую стратегию можно реализовать при помощи программирования, управляемого данными. К примеру, предположим, что сведения о персонале каждого подразделения устроены в виде единого файла, который содержит набор записей, проиндексированных по имени служащего. Структура набора данных от подразделения к подразделению различается. Более того, каждая запись сама по себе - набор сведений (в разных подразделениях устроенный по-разному), в котором информация индексируется метками вроде address (адрес) или salary(зарплата). В частности: a.Для главного офиса реализуйте процедуру get-record, которая получает запись, относящуюся к указанному служащему, из указанного файла персонала. Процедура должна быть применима к файлу любого подразделения. Объясните, как должны быть структурированы файлы отдельных подразделений. В частности, какую информацию о типах нужно хранить? b.Для главного офиса реализуйте процедуру get-salary, которая возвращает зарплату указанного служащего из файла любого подразделения. Как должна быть устроена запись, чтобы могла работать эта процедура? c.Для главного офиса напишите процедуру find-employee-record. Она должна искать в файлах всех подразделений запись указанного служащего и возвращать эту запись. Предположим, что в качестве аргументов эта процедура принимает имя служащего и список файлов всех подразделений. d.Какие изменения требуется внести в систему, чтобы внести в центральную систему информацию о новых служащих, когда Insatiable поглощает новую компанию? |
Среды: 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 | ||