Н. Джехани - Язык Ада (1988) (1160771), страница 87
Текст из файла (страница 87)
Последовательность симво. лов, представляющая знак операции, должна представлять операцию, принадлежащую одному иэ шести классов совмещаемых операций, определенных в равд. 4.5 (пробелы недопустимы, а относительно букв ограничений нет). Спецификация параметра с несколькими идентификаторами эквивалентна последовательности спецификаций с одним параметром, как поясняется в равд. 3.2. Каждая спецификация одного параметра описывает формальный параметр. Если вид явно не задан, то предло. лагается вид (и. Если спецификация параметра оканчивается выражением, то оно является выражением по умолчанию формального параметра.
Выражение по умолчанию допустимо только в спецификации параметра вида (и (независимо от явного или неявного его указания). Тип выражения по умолчанию должен совпадать с типом соответствующего формального па.раметре. Глава 6 Не допускается использование имени, обозначающего формальный параметр, в выражении по умолчанию, если спецификация этого параметра дана в том жв разделе формальных параметров. Предвыполнение описания подпрограммы предвыполняет соответствующий раздел фор. мальных параметров. Предвыполнение раздела формальных параметров не дает другого эффекта. Примеры описания подпрограмм: пассов~не ТНАЧЕНЕЕ ТЯЕЕ; ргосолко )МСВЕМЕМТ(Х: )и онг )МТЕОЕЯ); рпиквнго Я)ОНТ )МОЕМТ(МАЙО!М: он! Ь)МЕ 8)ЕЕ); ргосеаио ЗЧУ)ТСН(РВОМ, ТО: )и ао! ММК); — см.
3.5.4 — см. 3.8.1 — — см. 3.5.7 !пианол ЯАМООМ книп РВОВАВ!Шту; Ъпаяоп М(М СЕЩХ: ММК) книп СЕщс — — см. 3.8.1 Викяоп МЕХТ ЕВАМЕ(К: Р08)Т(ЧЕ) ккт РНАМЕ: — — см. 3.8 Викяоп ООТ РЯОООСТН.ЕРТ,Я)6НТ: ЧЕСТОВ) манго ЯЕА!.: — — см 36 анпсвои " "(!.ЕРТ,Я!6НТ: МАТЙ!Х) капп МАТЯ)Х; — см. 3.6 Примеры параметров с выражениями по умолчанию; ргоаовнга РЯ)МТ НЕАОЕЯ(РАОЕЕ: )и МАТОВАЫ НЕАОЕВ: )П ШМЕ:= Н .. ШМШ(АЗТ г> ' '); — — СМ. 3.6 СЕМТЕЙ: М ВООЬЕАМ ы ТВОЕ); Примечание.
Вычисление выражений по умолчанию начинается при определенных вызовах подпрограмм, как пояснено в равд. 6.4.2 (выражения по умолчанию не вычисляются при предвыполнении описания подпрограммы). Все подпрограммы могут быть вызваны рекурсивно и являются реентерабельными. Ссылки: вид 6.2, вызов подпрограммы 6.4, выражение 4.4, вычисление 4.5, идентификатор 2.3, имя 4.1, обозначение типа 3.3.2, операция 4.5, описание 3.1, предвыполнение 3.9, пред- выполнение не имеет другого эффекта 3.9, процедура 6, совмещение 6.6, 8.7, список идентификаторов 3.2, строковый литерал 2.6, формальный параметр 6.2, функция 6.5. 6.2.
ВИДЫ ФОРМАЛЬНЫХ ПАРАМЕТРОВ )п Формальный параметр — константа, разрешается только чтение зна- чения соответствующего фактического параметра. )п оЫ Формальный параметр — переменная, разрешается как чтение, так и изменение значения соответствующего фактического параметра. Формальный параметр — переменная, разрешается изменение значе. ния соответствующего фактического параметра.
Значение скалярного параметра, которое не изменяется при вызове, после возврата не определено; то же самое имеет место для значе- ния скалярной подкомпоненты, отличной от дискриминанта. Допу- скается чтение границ и дискриминантов формального параметра и его подкомпонент; никакое другое чтение не допускается. он( Для скалярного параметра такой эффект достигается копированием: в начале каждого вызова значение фактического параметра, соответствующего формальному параметру вида )л Говорят, что значение объекта читается, когда это значение вычисляется; оно также читается, когда читается одна из его подкомпонент.
Говорят, что значение переменной изменяется, когда выполняется присваивание этой переменной, а также (косвенно) когда эта переменная используется в качестве фактического параметра оператора вызова подпрограммы или оператора вызова входа, которые изменяют ее значение; говорят также, что оно изменяется, когда изменяется одна из его подкомпонент. Формальный параметр подпрограммы бывает одного иэ следующих трех видов: П л шшы или (и оц(, копируется в этом формальном параметре (прямое копирование); затем после нор. мального окончания тела подпрограммы значение формального параметра вида (л ои( или ои( копируется обратно в соответствующем фактическом параметре (обратное копирование). Для параметра ссылочного типа прямое копирование используется для всех трех видов, а обратное — для видов (и ом( и ом(. Для параметров индексируемого, именуемого или задачного типов реализация может достигнуть такого же эффекта копированием, как и для скалярных типов.
Кроме того, если копирование используется для параметра вида ом(, то прямое копирование требуется по край. ней мере для границ и дискриминантов фактического параметра и его подкомпонент, а также для каждой подкомпоненты ссылочного типа. Другой вариант — вызов ссылкой, когда каждое исполыювание формального параметра (чтение или изменение его значения) рассматрива. ется как использование соответствующего фактического параметра при выполнении вызова подпрограммы.
В языке не определяется, какой из этих двух механизмов следует применять для передачи параметров; не определяется также, что различные вызовы одной и той же подпрограммы должны использовать один и тот же механизм. Выполнение программы оши. бочно, если ее результат зависит от механизма, выбираемого реализацией. Для параметра личного типа вышеуказанный эффект достигается по правилу, которое применяется к соответствующему полному описанию типа.
В теле подпрограммы формальный параметр отвечает любому ограничению, вытекающему из обозначения типа, данного в спецификации этого параметра. В качестве границ формального параметра неограниченного индекснруемого типа берутся границы фактического па. раметра (см. 3.6.2). Для формального параметра, описание которого задает неограниченный (личный или именуемый) тип с дискриминантами, дискриминанты этого формального параметра инициализируются значениями соответстзующих дискриминантов фактического параметра; формальный параметр не ограничен тогда и только тогда, когда его вид )и оМ или ом( и имя переменной, являющейся фактическим параметром, обозначает неограниченную переменную (см.
3.7.1 и 6.4.1). Если фактический параметр вызова подпрограммы является подкомпонентой, которая зависит от дискриминантов переменнои неограниченного именуемого типа, то выполнение вызова ошибочно, если значение любого дискриминанта переменнои изменяется при этом выполнении; это правило не применяется, если вид параметра (п и тип подкомпоненты — скалярный тип или ссыпочный тип.
Примечание. Из правил передачи параметров индексируемого и именуемого типов следует: ° Если выполнение подпрограммы прекращено в результате исключения, конечное значе. ние фактического параметра такого типа может быть либо тем же, что и до вызова, либо значением, присвоенным формальному параметру во время выполнения подпрограммы. ° Если доступ ко всем фактическим параметрам такого типа осуществляется одним способом, то результат вызова подпрограммы (при отсутствии исключения) не зависит от того, использует ли реализация для передачи параметров копирование.
Если, однако, доступ к фактиче. скому параметру осуществляется несколькими способами (например, если глобальная переменная или другой формальный параметр ссыпается на один и тот же фактический параметр), то значение формального параметра после изменения фактического способом, отличным от изменения формального, неопределенно. Программа, использующая такое неопределенное значение, является ошибочной. Такие же виды параметров определены и для формальных параметров входов (см.
9.5] с тем же смыслом, что и для подпрограмм. Для формальных параметров настройки определены другие виды параметров (см. 12.1.1). Для всех видов справедливо, что если фактический параметр указывает задачу, то соответствующий формальный параметр указывает ту же задачу; то же самое имеет место для подкомпоненты фактического параметра и соответствующей подкомпоненты формального параметра. Ссылки: вид 6.1, выражение 4.4, вычисление 4.5, глобальный 8.1, граница массива 3.6.1, дискриминант 3.7.1, зависеть от дискриминанта 3.7.1, задача 9, задачный тип 9.2, именуемый тип 3.7, индексируемый тип 3.6, исключение 11, личный тип 7.4, неограниченная переменная 3.2.1, неограниченный индексируемый тип 3.6, неограниченный тип с дискриминантами 3.7.1, обозначение типа 3.3.2, объект 3.2, ограничение 3.3, оператор вызова входа 9.5, оператор 379 вызова подпрограммы 6.4, ошибочный 1.6, переменная 3.2.1, подкомпонента 3.3, присваивание 6.2, скалярный тип 3.6, спецификация параметра 6.1, ссылочное значение лвЕ 3.8, ссылочный тип 3.8, тело подпрограммы 6.3, фактический параметр 6.4.1, формальный параметр 6.1, фор.
мальный параметр настройки 12.1. 6.3. ТЕЛА ПОДПРОГРАММ Тело подпрограммы определяет ее выполнение. тело подпрограммы с= спецификация подпрограммы (в (раздел описаний) Ьв9)п последовательность операторов (ехсерИоп обработчик исключения (обработчик исключенияД епд [обозначение); Описание подпрограммы необязательно. При отсутствии описания спецификация подпрограммы в ев теле(или в следе тела) играет роль описания. Для каждого описания подпрограммы должно быть соответствующее тело (кроме подпрограмм, написанных на другом языке, как поясняется в равд. 13.9). Если даны и описание, и тало, то спецификация подпрограммы в теле должна быть согласована со спецификацией подпрограммы в описании (см.