Н. Джехани - Язык Ада (1988) (1160771), страница 111
Текст из файла (страница 111)
ж) Имя обозначает формальный параметр формальной подпрограммы настройки: соответствующее в экземпляре имя обозначает соответствующий формальный параметр фактиче. ской подпрограммы, соотввтствующей формальной подпрограмме. з) Имя обозначает локальное понятие, описанное в настраиваемом модуле: соответствую. щее в экземпляре имя обозначает понятие, описанное соответствующим локальным описанием в экземпляре. и) Имя обозначает глобальное понятие, описанное вне настраиваемого модуля: соответствующее в экземпляре имя обозначает это же глобальное понятие. Те же правила справедливы для знаков операций и базовых операций; в частности, для формальных операций верно правило е), для локальных операций — правило з) и для опера. ций над глобальными типами — правило и).
Кроме того, если в настраиваемом модуле испо. льзуется предопределенная операция или базовая операция над формальным типом„ то в экземпляре используется предопределенная операция, соответствующая фактическому типу, со. поставленному формальному. Эти же правила применяются к обозначению типа и выражению (по умолчанию) из раздела формальных параметров настроики настраиваемого модуля. При предвыполнении конкретизации настройки осуществляются следующие действия.
Сначала вычисляется каждое выражение, заданное в качестве явного фактического параметра настройки, и каждое выражение, входящее как составная часть в имя переменной или входа, заданное в качестве явного фактического параметра настройки; в языке не определен порядок вычисления этих выражений. Затем вычисляются выражения или имена по умолчанию для тех параметров, для которых опущены сопоставления параметров (если они есть) настройки; эти вычисления производятся в порядке следования описаний формальных параметров настройки.
Наконец, предвыполняется неявно сгенерированный экземпляр. Предвыпо. лнение конкретизации настройки может также вызывать проверки некоторых ограничений, как описано ниже. Рекурсивная конкретизация настройки недопустима в следующем смысле: если данный настраиваемый модуль включает конкретизацию другого настраиваемого модуля, то экземпляр, сгенерированный этой конкретизацией, не должен включать экземпляр первого настраи. ваемого модуля (независимо от того, генерируется ли этот экземпляр непосредственно или косвенно через промежуточную конкретизацию). Мест»еаемые мо л» Примеры конкретизации настронкн (см. 12П): рпмайпе ВЬЧАР )а пе»» ЕХСНАМОЕ(Е«ЕМ => 1МТЕ6ЕЯ); ргссмвпе ВччАР 1 ° пеп ехснАм6е(снАВАстея); — -совмещение идентификатора 8чуАР ывсэйп 80ОАВе и пе»» 50ОАЙ1Н6 ()мтебея); — -по умолчанию используется «'» над )ЙТеОен (ппм)еп ВООАЯЕ М пе»с 50ОАЯ1М6 ()ТЕМ => МАТЙ)Х, » > МАТЯ1Х РЯООЧСТ); в»псв ВООАяе м веп ВОЧАВРЙО (млтя!х, млтя1х..рвооцст)! — что эквивалентно предыдущему расьаее 1МТ ЧЕСТОВВ )с пее ОМ ЧЕСТОЯВ(1МТЕОЕВ, ТАВЬЕ, "» ); Примеры использования конкретизированных модулей: ВЬЧАР(А, В): А '- 801)АЙЕ(А)! Т: ТАВ1.Е(1 ..
8);= (10, 20, 30, 40, 50); М: )МТЕОЕЯ:= )МТ ЧЕСТОЯ5.516МА(Т): — 150 (см. 12.2) пса 1МТ ЧЕСТОЯ5; М: 1МТЕОЕВ:= 816МАП): — 150 Примечание. Опускать параметр настройки допускается только тогда, когда для него существует умолчание. Если использованы выражение по умолчанию или (отличные от простых) имена по умолчанию, то они вычисляются в том порядке, в котором описаны соответствующие формальныв параметры настройки. Если две совмещенные подпрограммы описаны в спецификации настраиваемого пакета и различаются только (формальным] типом параметров и результата, то существуют'правиль. ные конкретизации, для которых все вызовы этих подпрограмм вне экземпляра будут неоднозначными.
Например; весе»с 1тре А 1 ° (<>)! !тра В !с ря»жа! рвсзаре 6 1 ° Ямсесв МЕХТ(Х: А) мзпгп А; Гвл«1юп ЙЕХТ(Х: В) ИамП В; апв; расзаее Р 1 ° пеп 6(А => ВООЬЕАМ. В => ВООЬЕАМ)! — все вызовы Р.МЕХТ неоднозначны Ссылки: вид (и 12.1.1, вид 1и ов( 12.1.1, видимость 8.3, вызов подпрограммы 6.4, выражение 4.4, вычисление 4.5, глобальное описание 8.1, дискриминант 3.7.1, знак операции 6.1, иденти. фикатор 2.3, имя 4.1, имя входа 9.5, имя подпрограммы 6.1, локальное описание 8.1, неявное описание 3.1, обозначение 6.1, обозначение типа 3.3.2, описание 3.1, описание подтипа 3.3.2, операция типа 3.3, описание формального параметра настроики 12.1, пакет 7, переменная 3.2.1, подпрограмма 6, понятие 3.1, предвыполнение 3.1, 3.9, простое имя 4.1, совмещение 6.6, 8.7, формальная подпрограмма настройки 12.1, формальный объект настройки 12.1, формальный параметр настройки 12.1, формальный тип настройки 12.1.
12.3.1. ПРАВИЛА СОПОСТАВЛЕНИЯ ДЛЯ ФОРМАЛЬНЫХ ОБЪЕКТОВ Формальному параметру настройки вида!и данного типа сопоставляется выражение этого же типа Если настраиваемый модуль имеет формальный объект настройки вида Ея то проверяется принадлежность значения выражения подтипу, заданному обозначением типа, как и для явного описания константы (см. 3.2.1). При отрицательном результате проверки возбуждается исключение СОМЗТНА)НТ ЕННОН.
Формальному параметру настройки вида )и ов! данного типа сопоставляется имя переменнои этого же типа. Переменная не должна быть формальным параметром вида ом( или его подкомпонентой. Имя должно обозначать такую переменную, для которой допустимо переименование (см. 8.5). Примечаний Тип фактического параметра настройки вида )и не должен быть лимитируе.
мым типом. Ограничения формального параметра настройки вида )и ом( являются ограничени. ями соответствующего фактического параметра настройки (см. 12.2.1). Глава 12 Ссылки: вид (л 12.1.1, вид )п о!П 12.1.1, вид оц! 6.2, возбуждение исключения 11, выраже. ние 4.4, имя 4.1, исключение СОНВТЙА!НТ ЕЙЙОЙ 11.1, конкретизация настройки 12.3, лимитируемый тип 7.4.4, настраиваемый модуль 12.1, обозначение типа 3.3.2, ограничение З.З, пере.
менная 3.2.1, подкомпонента 3.3, сопоставление фактических параметров настройки 123, тип 3.3, удовлетворять 3.3, фактический параметр настройки 12.3, формальный объект настройки 12.1.1, формальный параметр 6.1, формальный параметр настройки 12.1. 12.3.2. ПРАВИЛА СОПОСТАВЛЕНИЯ ДЛЯ ФОРМАЛЬНЫХ ЛИЧНЫХ ТИПОВ Формальный личный тип настройки сопоставляется с типом или подтипом (фактическим подтипом), удовлетворяющим следующим условиям: ° Если формальный тип не является лимитируемым, то фактический тип не должен быть лимитируемым.
(С другой стороны, если формальный тип является лимитируемым, то соответствующий фактический тип может быть лимитируемым и нелимитируемым.) ° Если формальный тип имеет раздел дискриминантов, то фактический тип должен быть типом с таким же числом дискриминантов; тип дискриминанта в данной позиции в разделе дискриминантов фактического типа должен совпадать с типом дискриминанта в той же позиции раздела дискриминантов формального типа; фактический подтип должен быть неограниченным. (С другой стороны, если формальный тип не имеет дискриминантов, для фактического типа дискриминанты допустимы.) Ниже рассматривается вхождение имени формального типа в том месте, где оно испо. льзовано как указание неограниченного подтипа. Фактический подтип не должен быть неограниченным индексируемым типом или неограниченным типом с дискриминантами, если любое вхождение находится на месте, где для индексируемого типа или типа с дискриминантвми требуется либо ограничение, либо выражения по умолчанию для дискриминантов (см.
3.6.1 и 3.7.2). Такое же требование предъявляется ко всем вхождениям имени подтипа формальнб го типа, а также к вхождениям имени любого типа или подтипа, производного (непосредственно или косвенно) для этого формального типа. Если настраиваемый модуль имеет формальный личный тип с дискриминантами, то при предвыполнении соответствующей конкретизации настройки проверяется совпадение подти.
па каждого дискриминанта фактического типа и подтипа соответствующего дискриминанта формального типа. При несовпадении таких подтипов возбуждается исключение СОНЗТЙА!НТ ЕЙЙОЙ. Ссылки: возбуждение исключения 11, выражение по умолчанию для дискриминанта 3.7.1, дискриминант 3.7.1, имя 4.1, индексируемый тип 3.1, исключение СОМВТЙА(НТ ЕЙЙОЙ 11.1, конкретизация настройки 12.3, лимитируемый тип 7.4.4, личный тип 7.4, настраиваемое тело 12.2, неограниченный индексируемый тип 3.6, неограниченный подтип 3.3, обозначение подти. па 3.3.2, ограничение 3.3, подтип 3.3, предвыполнение 3.9, производный тип 3.4, раздел дискриминантов 3.7.1, сопоставление фактических параметров настройки 12.3, спецификация настройки 12.1, тип 3.3, тип с дискриминантами 3.3, фактический тип настройки 12.3, формальныи тип настройки 12.1.2.
12.3.3. ПРАВИЛА СОПОСТАВЛЕНИЯ ДЛЯ ФОРМАЛЬНЫХ СКАЛЯРНЫХ ТИПОВ Формальному типу настройки, определенному символами (< >), сопоставляется любой дискретный подтип (т.е. любой перечислимый или целый подтип). Формальному типу настройки, определенному символами гапйе < >, сопоставляется любой целый подтип. Формальному типу настройки, определенному символами б!9!(в < >, сопоставляется любой плавающий подтип. Формальному типу настройки, определенному символами де(цз < >, сопоставляется лю. бой фиксированный подтип.
Никакие другие сопоставления для этих формальных типов настройки невозможны. Ссылки: бокс 12.1.2, дискретный тип 3.5, определение настраиваемого типа 12.1, перечислимый тип 3.5.1, плавающий тип 3.5.7, скалярный тип 3.5, сопоставление фактических парамет.