Н. Джехани - Язык Ада (1988) (1160771), страница 42
Текст из файла (страница 42)
Например, к функциям, названным ЕМРТУ, связанным с пакетами БЕТ 1 и БЕТ 2, можно обращаться как БЕТ 1.ЕМРТУ и ЯЕТ 2.ЕМРТУ Много экземпляров объектов, реализуемых пакетом, можно получить, используя либо настраиваемый пакет без параметров„либо лимнтируемые личные типы. В чем различие этих двух подходов? Решение этой задачи предлагается читателю в качестве упражнения.
Указание: проанализировать правила видимости и обращения к операциям в этих двух случаях. 6.6. Правила сопоставления для формальных параметров настройки [12.3.Ц Сопоставление формальных параметров настройки н соответствующих фактических параметров при конкретизации настраиваемой подпрограммы или пакета должно подчиняться правилам, описанным ниже. 1.
Обычные параметры. Типы фактических параметров настройки должны соответствовать типу формального параметра настройки и удовлетворять всем наложенным ограничениям. 2. Формальные личные типы. Формальный личный тип сопоставляется с любым фактическим типом, удовлетворяющим следующим условиям. Если формальный личный тип а) является лимитнруемым личным типом, то ему может быть сопоставлен любой тип, включая заданный тип; б) не является лимитируемым личным типом, то ему может быть сопоставлен любой фактический тип, над которым определены операции равенства, неравенства и присваивания; в) имеет дискримннанты, то они должны согласовываться с дискрнмннантами фактического типа. 3. Формальные скалярные типы.
Формальному скалярному типу, специфицированному как а) (< >), сопоставляется любой дискретный тип; б) гапйе < >, сопоставляется любой целый тип; в) д)яив < >, сопоставляется любой тип с плавающей точкой; г) деНа < >, сопоставляется любой тип с фиксированной точкой. Наст аиваватыв аю аи 4. Формальные индексируемые типы. Тип фактического параметра должен иметь столько же индексов, сколько и настраиваемый формальный тип. Кроме того, после замены любого настраиваемого типа в формальном индексируемом типе на соответствующий фактический тип индексируемые типы должны иметь одни и те же компоненты и типы индексов (в том же порядке) и одинаковые ограничения.
Если либо формальный индексируемый тип, либо соответствующий фактический параметр являются неограниченными, то и другой тип также должен быть неограниченным. 5. Формальные ссылочные типы. Если тип объекта в формальном ссылочном типе является настраиваемым, то прежде всего он замещается соответствующим фактическим типом. После выполнения подстановки формальный ссылочный тип и фактический ссылочный тип должны иметь одинаковые типы объектов. б. Формальные лодлрограммьь Если существует несколько типов настройки в формальной подпрограмме настройки, то они прежде всего замещаются соответствующими фактическими типами. После замещения формальная и фактическая подпрограммы должны быть такими, чтобы нх соответствующие параметры имели одинаковый тип, одинаковый вид и одинаковое ограничение.
Если формальная подпрограмма является функцией, то настраиваемые формальный и фактический типы результата и ограничения на них также должны быть одинаковыми. Операцию можно передать в качестве фактического параметра настройки для формального параметра — функции. Аналогично функцию можно передать в качестве фактического параметра настройки для формального параметра настройки, являющегося операцией. Вход можно передать как фактический параметр настройки для формального параметра процедуры подпрограммы настройки.
6.7. Примеры Первый пример — это настраиваемый пакет, который можно использовать для создания стеков любого размера и с любым типом элементов. Затем следует настраиваемая процедура сортировки, которую можно использовать для сортировки массивов любого типа, скажем, записей служащих, используя операцию сравнения, определенную для этого типа. В языке программирования Ада в отличие от многих языков, таких как, например, Паскаль и Алгол-60, подпрограммы нельзя передавать в качестве обычных параметров. Настраиваемые модули позволяют осуществить передачу подпрограмм как параметров. Это показано на примере вычисления интеграла.
Следующий пример является настраиваемым пакетом, который можно использовать для создания множества с различными типами элементов. Последние два примера показывают, как настраиваемые модули можно использовать для реализации некоторых классов операторов, таких как операции над массивами и функции МАРЫБТ языка Лисп. 6.7.1.
Спй.ки Задача состоит в том, чтобы реализовать настраиваемый пакет для стека, который можно использовать для создания стеков различных размеров и с различными типами элементов. Спецификация такого пакета БТАСК О, приведенная ранее, воспроизводится здесь еще раз: 210 Глава В пепе г1с Я12Е: РОЯ1Т1ЧЕ; гуре ЕЬЕМ )а рпгаге; раеЬапе ЯТАСК 0 Ь ргосейиге Р()ЯН(Е: Ьг Е1.ВМ); ргосеопге РОР(Е: овг Б1.ЕМ); ЯТАСК ОЧЕКРЬОЪУ, ЯТАСК ИХОЕКРЬОзЧ: ехсер(1ов; еги1 ЯТАСК 0; Тело настраиваемого пакета БТАСК 0 приводится ниже: расЬапе )ни1у ЯТАСК 0 (я БРАСЕ: апау(Ь.Я1ЕБ) оу Б1.ЕМ; — Б1г,Е и ЕЬЕМ формальные параметры настройки 1ХОЕХ: 1ХТЕОЕК гавпе О..Я1ЕБ: О; ргоса)пге Р()ЯН(В: 1в БЬЕМ) )а Ьев(п 11 1ХОЕХ Я1ЕБ (Ьев капе ЯТАСК ОЧЕКРЬ0%; епп 1Б 1ХОЕХ: 1ХОЕХ + 1; БРАСЕ(1ХОЕХ): Е; евй РЫЯН; ргосеввге РОР(Е: овг Б1.ЕМ) 1в Ьефа 11 1ХОЕХ 0 ГЬев гаво ЯТАСК (ЗХОЕКРЬОЧг'; епо!1; Б: БРАСЕ(1ХОБХ); 1ХОЕХ: 1ХОБХ вЂ” 1; еЫ РОР; евй ЯТАСК 0; Любые исключения, возбуждаемые при вызове Р(ЗБН и РОР, распространяются на вызывающую процедуру.
По виду тела БТАСК-0 (и игнорируя комментарии) невозможно сказать, является ли тело БТАСК 0 обычным или настраиваемым пакетом. 6.7.2. Настраиваемая процедура сортировки Процедура сортировки вставками, приведенная в гл. 1, модифицируется здесь таким образом, чтобы сделать ее настраиваемой. Спецификация настраиваемого варианта 1ХБЕКТ10Х БОКТ 0 следующая: яепепс 1уре Е1.ЕМ 1я рпгаге; гуре ЧЕСТОК 1а аггауНХТЕОЕК ганне ()) оу Е1.ЕМ; г!з Наст ливлемые мо ли в41Ь 1аасг!оа ">" (А, В: !а Е1.ЕМ) гегагп В001.ЕАХ 1в < >; — если операция сравнения > для элементов типа Е1.ЕМ вЂ” - отсутствует, то она должна присутствовать в -- контексте конкретизации ргосеоаге 1ХБЕКТ1ОХ БОКТ б(А: !и оп! ЧЕСТОК); Настраиваемую процедуру 1ХБЕКТ10Х ЯОКТ б можно использовать при конкретизации процедур, которые сортируют массивы только с целыми индексами.
Это ограничение можно снять, если использовать параметр настройки для типа индексов массива, как это показано в спецификации процедуры бЕХЕКА1. 1ХБЕКТ1ОХ БОКТ б: аеаег!с гуре Е1,ЕМ 1в рпчаге; !уре 1Х(УЕХ !в (< >); -- любой дискретный тип Гуре ЧЕСТОК !в апчгу(1ХРЕХ) о1 ЕЬЕМ; чч!(Ь Йесг!оп "> "(А, В: 1а Е1.ЕМ) ге(агп В001.ЕАХ 1в < >; ргоееоаге ОЕХЕКАЫХБЕКТ1ОХ БОКТ б(А: !и оаг ЧЕСТОК); Хотя информацию, которую несет третий параметр, можно получить из первых двух, тем не менее накладываемые на типы условия требуют присутствия этого третьего параметра.
Тело 1ХБЕКТ10Х БОКТ б имеет вид ргоееаа е 1ХБЕКТ10Х БОКТ б(А: !а оаг ЧЕСТОК) !в 1, ): А КАХОЕ; Т: ЕЬЕМ; -- тнп временной переменной Т является -- формальным типом настройки Е1.ЕМ Ь: 1ХТЕОЕК: А'Р1КБТ; Ю 1ХТЕОЕК: А'1.АБТ; Ьей!а 1: 1.; ччЬВе 1 / Ы !оор Т: А(1+1); ,): 1+1; ччЬВе ) / 1. аао гЬеа АО-!) > Т !оор АО): АО-1); э: з-1; еао !оор; А(У): Т; 1: 1+1; еао !вор; еао ЬХБЕКТ1ОХ БОКТ б; 212 Гиаве в Предположим, что при конкретизации имеют силу следующие описания: гуре ВООЬЕАХ АККАУ (а апау(1ХТЕОЕК ганне ( >) оу ВООЬЕАХ; Фуре ЕМРЬОУЕЕ 1в гесогЬ ХАМЕ: ЗТК1ХО(1..40); 1Еч 1ХТЕОЕК; епЬ КЕСОК1); гуре ЕМРЬОУЕЕ АККАУ 1а аггау(1ХТЕОЕК ганне с >) о1 ЕМР1.ОУЕЕ; йвсбоп "> "(А, В: ш ЕМРЬОУЕЕ) гегигп ВООЬЕАХ 1в йей1п гении А.11) > В.10; епЬ ">"; Сортировка для массивов с элементами типа ВОО1.ЕАХ и ЕМР1 ОУЕЕ конкретизируется следующим образом: ргосеЬнге ВООЬЕАХ ЯОКТ 1в пезг!ХБЕКТ10Х ЗОКТ б(ЕЬЕМ > ВООЬЕАХ, ЧЕСТОК > ВООЬЕАХ АККАУ, "»" ">"); -- формальный параметр настройки, представляющий — операцию «больше чем», имеет одно и то же имя с — фактическим параметром настройки, т.
е. символом > ргосеЬиге ЕМРЬОУЕЕ ЯОКТ 1в пеп 1ХБЕКТ1ОХ БОКТ б(ЕЬЕМ > ЕМРЬОУЕЕ, ЧЕСТОК > ЕМРЬОУЕЕ АККАУ, "»" ">") Если операция сравнения не была задана при конкретизации ВООЬЕАХ БОКТ: ргосеЬиге ВООЬЕАХ БОКТ 1в пезг 1ХБЕКТ1ОХ ВОКТ б(ЕЬЕМ > ВООЬЕАХ, ЧЕСТОК > ВООЬЕАХ АККАУ); то по умолчанию будет использоваться операция сравнения из контекста конкретизации, если она существует.
В противном случае подобная конкретизация приведет к ошибке времени компиляции. В приведенной выше настройке ЕМР1.ОУЕЕ БОКТ для параметров используется именная нотация. Однако здесь можно было бы также использовать и позиционную нотацию. Например, ргосеЬнге ЕМРЬОУЕЕ БОКТ!я пен 1ХБЕКТ1ОХ БОКТ б(ЕМРЬОУЕЕ, ЕМР1.ОУЕЕ АККАУ, ">"); Функпия с двумя формальными параметрами и идентификатором в качестве имени вместо символа операции также может быть фактическим параметром Няег яивяемме мо ии 213 настройки для соответствующего формального параметра, являющегося опера- цией.