Н. Джехани - Язык Ада (1988) (1160771), страница 89
Текст из файла (страница 89)
Сопоставления параметров вызова подпрограммы вычисляются в некотором порядке, не определенном в языке. Аналогично правила языка не определяют, в каком порядке значения параметров вида 1л ом( или ои( копируются обратна в соответствующих фактических параметрах (если это делается). П и шшы 373 64.1. СОПОСТАВЛЕНИЯ ПАРАМЕТРОВ Тип каждого фактического параметра должен совпадать с типом соответствующего формального параметра. Фактический параметр, сопоставляемый с формальным параметром вида 1и, должен быть выражением; оно вычисляется до вызова.
Фактический параметр, сопоставляемый с формальным параметром вида )п оц( или оф, должен быть либо именем переменнои, либо иметь форму преобразования типа с аргументом, являющимся именем переменной. В любом случае для параметра вида )п ои( переменная не должна быть формальным параметром вида оц( или подкомпонентой такого параметра. Для фактического параметра, который имеет форму преобразования типа, обозначение типа должно быть согласовано (см. 6.3.1) с обозначением типа формального параметра; допустимыи операнд и целевой тип такие же, как и для преобразования типа (см. 4.6]. Данное для фактического параметра вида (п ом( или оф имя переменнои вычисляется до вызова.
Если фактический параметр имеет форму преобразования типа, то перед вызовом для параметра вида (п ои1 переменная преобразуется к заданному типу; после (нормального) окончания тела подпрограммы формальные параметры вида (п оф или ом( преобразуются обратно в тип переменнои.(Тип преобразования должен быть тем же, что и у формального параметра.) Для параметров скалярного и ссылочного типов проверяются следующие ограничения: ° Перед вызовом для параметра вида (п или (и ом( проверяется принадлежность фактического параметра подтипу формального параметра. ° После (нормального) окончания тела подпрограммы для параметра вида (п оц1 или ом( проверяется принадлежность значения формального параметра подтипу фактического параметра. В случае преобразования типа значение формального параметра преобразуется обратно и проверяется результат преобразования.
В каждом из вышеуказанных случаев выполнение программы ошибочно, если проверяемое значение неопределено. Для параметров других типов всех видов проверка осуществляется до вызова, как для скалярных и ссылочных типов; после возврата никаких проверок не делается.
Если результат хотя бы однои проверки отрицателен, то при вызове подпрограммы возбуждается исключение СОМЗТЯА1НТ ЕЯЯОЯ. Примечание. Если обозначение типа формального параметра задает ограниченный подтип, то для индексируемых типов и типов с дискриминантами достаточно проверки перед вызовом (проверка после возврата была бы избыточной), так как ни границы массива, ни дискриминанты не могут быть изменены.
Если зто обозначение типа задает неограниченный индексируемый тип, то формальный параметр ограничен границами соответствующего фактического параметра и никакой проверки не требуется (ни до вызова, ни после возврата, см. 3.6.1). Аналогично не требуется никакой проверки, если обозначение типа обозначает неограниченный тип с дискриминантами, так как формальный параметр ограничен точно так же, как соответствующий фактический параметр (см. 3.7Л). Ссылки: вид 6.1, вызов подпрограммы 6.4, выражение 4.4, вычисление 4.5, вычисление имени 4.1, граница массива 3.6, дискриминант 3.7.1, имя 4.1, индексируемый тип 3.6, исключение СОНЗТЯА1НТ ЕЯЯОЯ 11.1, неограниченный индексируемый тип 3.6, неограниченный тип с дискриминантами 3.7.1, неопределенное значение 3.2.1, обозначение типа 3.6.2, ограничение 3.3, ограниченный подтип 3.3, ошибочныи 1.6, переменная 3.2.1, пбдтип 3.3, преобразование типа 4.6, согласованный 6.3.1, сопоставление параметров 6.4, тип 3.3, фактический параметр6.4, формальный параметр 6.1.
6.4.2. ОПУЩЕННЫЕ ПАРАМЕТРЫ Если спецификация параметра включает выражение по умолчанию для параметра вида (п, то соответствующие вызовы подпрограммы не обязательно содержат сопоставления дпя такого параметра. Если в вызове сопоставление для таких параметров опускается, то оставшаяся часть вызова, следующая за начальными позиционными сопоставлениями, должна использовать только именованные сопоставления. Глава В 374 Для любого опущенного сопоставления параметров выражение по умолчанию вычисляет. ся до вызова, а значение результата используется как неявный фактический параметр.
Примеры процедур со значениями по умолчанию: рппгенпге АСТ1ЧАТЕ< РЯОСЕ58: Ь РЯОСЕ$5 МАМЕ: АЛЕВ: Ь РВОСЕЗЗ МАМЕ ы МО РЯОСЕЗЗ; тчл(т: ь ооялт<бм .= о.о; РВ<бй: Ь ВООЬЕАМ:= РАЬЗЕ); ргееедпге РА<В(ЬЕРТ, й<ОНТ: РЕЯЗОМ МАМЕ ."= пем РЕЯЗОМ); Примеры нх вызовов: АСТ<ЧАТЕ<Х); АСТ<ЧАТЕ(Х, АРТЕЯ > УЕ АСТ1ЧАТЕ(Х, ЧУА<т => 60.0, РЯ<ОВ > ТЯОЕ); Аст1чАте(х, т, 10.0, РАЕЗе!1 РА(Я; РА<й(ЬЕРТ > иепг РЕЯЗОМ, Я(6НТ => пеги РЕЯВОМ): Примечание. Если выражение по умолчанию используется для двух или более параметров в групповой спецификации параметров, то это выражение по умолчанию вычисляется один раз для каждого опущенного параметра.
Поэтому в примере два вызова процедуры РА1В эквивалентны. Ссылки: вид 6.1, вызов подпрограммы 6.4, выражение по умолчанию для формального параметра 6.1, вычисление 4.5, именованное сопоставление параметров 6.4, позиционное сонг> ставление параметров 6.4, спецификация параметра 6.1, фактический параметр 6.1.
6.5. ФУНКЦИИ Функция — это подпрограмма, которая возвращает значение (результат вызова функции). Спецификация функции начинается с зарезервированного слова Мпсбол, а параметры, если они есть, должны иметь вид 1л (указанный явно или неявно). Операторы тела функции (исклю. чая операторы программных модулей, вложенных в тело функции) должны содержать один или несколько операторов возврата, определяющих возвращаемое значение. Исключение РВОЭВАМ ЕййОй возбуждается, если выход из тела функции осуществляет. ся не через оператор возврата. Это исключение не возбуждается, если выполнение функции прекращается в результате исключения. Пример: (ппеепп ООТ РВОООСТ(ЬЕРТ. й(6НТ: ЧЕСТОВ! Ь(пгп ЯЕАЬ и ЗОМ; ВЕА1.:= 0.0; Ьеа1п СНЕСК(ЬЕРТййЗТ = й<6НТ'ВЯЗТ епл (.ЕРГ1АЗТ = й<ОНТ'(АЗТ); Ьг 3 <и 1.ЕРГЯАМОЕ Ьпр 5ОМ:= ЗОМ + ЬЕРТ(дгй<ОНТ(З)1 ° гп< Ьер; В ЗЦМ( епв ООТ РЯОООСТ; Ссылки: вид 6.1, возбуждение исключений 11, вызов функции 6.4, исключение 11, исключение РВОЭВАМ ЕВВОВ 11.1, оператор 5, оператор возврата 5.8, спецификация функции 6.1, тело функции 6.3, формальный параметр 6.1, функция 6.1.
6.6. ПРОФИЛЬ ТИПА ПАРАМЕТРОВ И РЕЗУЛЬТАТА. СОВМЕЩЕНИЕ ПОДПРОГРАММ Два раздела формальных параметров называются имеющими одинаковый профиль типа параметров тогда и только тогда, когда они имеют одинаковое число параметров, а в каждой позиции соответствующие параметры имеют один и тот же базовый тип. Подпрограмма или вход имеет одинаковый профиль типа параметров и результата с другой подпрограммой или П л мы входом тогда и только тогда, когда оба имеют одинаковый профиль типа параметров, и либо оба являются функциями с одним и тем же базовым типом результата, либо оба функциями не являются. Один и тот же идентификатор подпрограммы или знак операции может быть использован для нескольких спецификаций подпрограмм. В этом случае идентификатор или знак опе. рации называется совмещенным; подпрограммы, которые имеют этот идентификатор или знак операции, тоже называются совмещенными и, следовательно, могут совмещаться друг с дру.
гом. Как поясняется в разд. 8.3, если две подпрограммы совмещаются дрУг с другом, то одна иэ них может скрыть другую, только если обе подпрограммы имеют одинаковый профиль типа параметров и реэультатао (см. 8.3, где описаны другие требования, необходимые для скрытия). Вызов совмещенной подпрограммы неоднозначен (и поэтому неправилен), если ее имя, число сопоставлений параметров, типы и порядок фактических параметров, имена формальных параметров(при использовании именованных сопоставлений параметров] и тип результата (з(ля функций) не позволяют идентифицировать единственную (совмещенную) спецификацию подпрограммы. Примеры совмещенных подпрограмм: рзееаеате РОТС(: (ШТЕОЕй): Ртееекизе Р(ЛТК: 8Тйпчй)т рзееебезе 8ЕПТ!МТ: Сбьбй); ртаеызие ЕЕП8(ОНА(.: ыйн'П; Примеры вызовов: РОТ(26)з Р(ЗТ( по розарио штю(йи(тт пете ): 8ЕТ(ТЯФТ => йЕО)„' 8ЕТ(8(6ШАк > ЯЕО): 8ЕТХОзОЗГ(йЕО))т — 6ЕТ (НЕС) может быть неоднозначныи, так как — — может обозначать значение типа СОЬОй и типа Примечание.
Понятие профиля типа параметров и результата не учитывает имен параметров, их видов и подтипов, а также присутствия или отсутствия выражений по умолчанию. Неоднозначности могут (но не обязательно) также возникнуть, когда фактические параметры вызова совмещенной подпрограммы сами являются вьшовами совмещенной функции, совмещенными литералами или агрегатами. Неоднозначности могут (но не обязательно) также возникнуть, когда видимы несколько совмещенных подпрограмм, принадлежащих различным пакетам.
Этих неоднозначностей мож. но избежать несколькими способами: использовать квалифицированные выражения для некоторых или для всех фактических параметров и результата, если он есть; имя такой подпро. граммы можно задавать более точно расширенным имвнем; наконец, такая подпрограмма может быть переименована.
Ссылки: агрегат 4.3, базовый тип 3.3, вид 6.1, вход 9.5, вызов функции 6.4, выражение по умолчанию для формального параметра 6.1, знак операции 6.1, идентификатор 2.3, имено. ванное сопоставление параметров 6.4, квалифицированное выражение 4.7, литерал 4.2, непра. вильный 1.6, описание переименования 8.5, пакет 7, параметр подпрограммы 6.2, подпрограмма 6, подтип 3.3, подтип результата 6.1, скрытие 8.3, совмещение 8.7, спецификация подл(и> граммы 6.1, тип 3.3, фактический параметр 6.4.1, формальный параметр 6.1, функция 6.5.