|
||||
Меню:
Главная
Форум
Литература: Программирование и ремонт Импульсные блоки питания Неисправности и замена Радиоэлектронная аппаратура Микросхема в ТА Рубрикатор ТА Кабельные линии Обмотки и изоляция Радиоаппаратура Гибкие диски часть 2 часть 3 часть 4 часть 5 Ремонт компьютера часть 2 Аналитика: Монтаж Справочник Электроника Мощные высокочастотные транзисторы 200 микросхем Полупроводники ч.1 Часть 2 Алгоритмические проблемы 500 микросхем 500 микросхем Сортировка и поиск Монады Передача сигнала Электроника Прием сигнала Телевидиние Проектирование Эвм Оптимизация Автомобильная электроника Поляковтрансиверы Форт Тензодатчик Силовые полевые транзисторы Распределение частот Резисторные и термопарные Оберон Открытые системы шифрования Удк |
[21] val у = Т.х+1 end; >structure S = val у = 8 : int end Ясно, что S может быть использована независимо от Т, хотя S и определена с помощью ссылки на Т. Эта форма зависимости иногда называется зависимостью по построению. Существенная зависимость является гораздо более важной. Одна из форм существенной зависимости возникает тогда, когда Т объявляет исключения, которые могут возбуждаться функциями, принадлежащими S. Например: -structure Т = exception Barf fun foo(x) = if x=0 then raise Barf else 3 div x end; >structure T = exception Barf val foo(x) = fn :int -> int end -structure S = fun g(x) = T.foo(x)+l end Поскольку вычисление S.g(O) возбуждает исключение Barf, использование S возможно только в том контексте, в котором доступна Т - иначе исключение не сможет быть обработано. Поэтому S существенно зависит от Т, и должна использоваться только вместе с Т. Заметьте, однако, что зависимость является неявной, поскольку сигнатура S не содержит ссылок на Т. Существенная и явная зависимость возникает тогда, когда S открыто использует рекурсивный тип, определенный в Т, как например: -structure Т = datatype a List = Nil I Cons of a * a List fun len(Nil) = 0 I len(Cons(h,t)) = 1 + len(t) >structure Т = type a List con Nil : a List con Cons : a * a List -> a List val len = fn : a List -> int end; -structure S = val len = T.len end; >structure S = val len = fn : a T.List -> int end Заметьте, что сигнатура структуры S содержит ссылку на структуру Т, отражая тот факт, что len может быть применена только к значениям типа, определенного в Т. Заметьте, что правило замкнутости сигнатуры не позволяет в приведенном выше примере приписать структуре S какую-либо нетривиальную сигнатуру, поскольку сигнатура не может содержать свободный идентификатор структуры Т. Это на первый взгляд может показаться неоправданным ограничением; однако этом позволяет привлечь внимание к тому факту, что S и Т тесно связаны между собой, и поэтому должны быть объединены в один модуль. Такое объединение может быть выполнено путем включения структуры Т в структуру S в качестве подструктуры; последнее достигается с помощью включения объявления Т в набор инкапсулированных объявлений S, как это показано в следующем примере: -structure S = structure Т = struct datatype a List = Nil I Cons of a * a List fun len(Nil) = 0 I len (Cons(h.t)) = 1 + len(t) end val len = T.len end >structure S = structure T = struct type a List con Nil : a List con Cons : а * a List -> a List val len = fn : a List -> int end val len = fn : a T.List -> int end Таким путем можно иерархически организовать взаимосвязанные структуры, и объединить набор связанных структур в модуль. Появление подструктур требует обобщения введенного ранее понятия пути доступа к структуре. В общем случае путь доступа к структуре записывается как разделенная точками последовательность имен структур, в которой каждая последующая структура является подструктурой предыдущей. Например, S.T является путем доступа к структуре, a S.T.len является составным именем, которое выбирает функцию len подструктуры Т структуры S. Если Т является подструктурой структуры S, то сигнатура S будет выглядеть следующим образом: -signature SIGT = datatype a List = Nil I Cons of a * a List val len : a List -> int end; -signature SIGS = structure T: SIGT val len : a T.List -> int end; Обратите внимание на спецификацию в SIGS, которая указывает, что подструктура Т должна быть сопоставима с сигнатурой SIGT. Заметьте также то, что спецификация для len в SIGS содержит T.List; T.List является локальным в SIGS благодаря тому, что Т есть подструктура S. Упражнение 3.2.6 Определите структуру Ехр, которая реализует некоторый рекурсивный тип выражений и набор связанных с ними операций. Эта структура должна быть сопоставимой с сигнатурой signature ЕХР = sig datatype id = Id of string datatype exp = Var of id I App of id * (exp list) |
Среды: 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 | ||