Два описания, которые находятся непосредственно в одной и той же зоне описания, не должны быть омографами, за исключением тех случаев, когда выполнены одно или оба следующих требования:

  1. только одно из них является неявным описанием предопределенной операции;

  2. только одно из них является неявным описанием производной под­программы.

В таких случаях предопределенная операция всегда скрыта дру­гим омографом производная подпрограмма скрывает предопределен­ную операцию, но скрыта сама любым другим омографом. Там, где скрытие осуществляется таким образом, неявное описание скрыто во всей области действия другого описания (независимо от того, какое описание стоит первым); неявное описание не видимо ни по имени, ни непосредст­венно.

Всегда, когда описание с определенным идентификатором видимо в данной точке, говорят, что идентификатор и описанное понятие (если оно есть) видимы в этой точке. Непосредственная видимость и видимость по имени для символьных литералов и знаков операции определяется анало­гично. Операция, обозначенная знаком, непосредственно видима тогда и только тогда, когда описание соответствующей операции непосредственно видимо. Наконец, обозначения, связанные с базовой операцией, непосредст­венно видимы во всей области действия этой операции.

Пример:

procedure Р is

А, В: BOOLEAN;

procedure Q is

C: BOOLEAN;

  1. BOOLEAN; - - внутренний омограф В

'begin

  1. = А; - - означает Q.B: = Р.А;

  2. = Р.В; - - означает Q.C: = Р.В;

end;

begin

А: = В; - - означает Р.А: = Р.В;

end;

Примечание о видимости библиотечных модулей. Видимость библиотечных моду­лей определена спецификаторами совместности (см. разд. 10.1.1) и тем фактом, что библиотечные модули неявно описаны в пакете STANDARD (см. разд. 8.6) .

Примечание об омографах. Один и тот же идентификатор может находиться в раз­личных описаниях и, таким образом, может соответствовать различным понятиям, да­

же если области действия описаний перекрываются. Перекрытие областей действия описаний с одним и тем же идентификатором может получиться из-за совмещения под­программ и литералов перечисления. Такое перекрытие может также произойти для понятий, описанных в видимых разделах пакета, а также входов, компонентов записей и параметров, где имеется перекрытие областей действия охватывающих описаний па­кета, описаний задачи, описаний именуемого типа, описаний подпрограмм, описаний переименований и описаний настройки. Наконец, перекрытие областей действия может быть результатом вложенности.

Примечание к непосредственной области действия, скрытию и видимости. Прави­ла, определяющие непосредственную область действия, скрытия и видимости, преду­сматривают, что ссылка на идентификатор в его собственном описании является непра­вильной (исключая случаи пакетов и настраиваемых пакетов). Идентификатор скры­вает внешние омографы в собственной непосредственной области действия (от начала описаний в области); с другой стороны, идентификатор является видимым только после конца описания. По этой причине все следующие описания (кроме последнего)

я

- - неправильно

вляются неправильными:

К: INTEGER: = К * К;

Т

- - неправильно - - неправильно - - неправильно

: Т;

procedure Р(Х:Р);

procedure Q(X: ВЕЩЕСТВ : = Q);

- - даже если существует функция с именем Q

procedure R(R: ВЕЩЕСТВ) ; - - внутреннее описание, правильное, хотя создает

- - путаницу

8.4. Спецификаторы использования

Спецификатор использования обеспечивает непосредственную види­мость описаний, которые находятся в видимых разделах пакетов с имена­ми, упомянутыми в спецификаторе использования.

спецификатор_использования : : = use тшя._пакета {,имя_иакега};

Для каждого спецификатора использования существует определенная зона текста, называемая областью действия спецификатора использования. Эта зона начинается непосредственно после спецификатора использования. Если спецификатор использования является элементом описания некоторой зоны описания, то область действия спецификатора использования распрос­траняется до конца этой зоны описания. Если спецификатор использования находится в спецификаторе контекста компилируемого модуля, то область действия спецификатора использования распространяется до конца зоны описания, связанной с данным компилируемым модулем.

Чтобы определить, какие описания становятся прямо видимыми в дан­ном месте с помощью спецификаторов использования, рассмотрим все па­кеты, упомянутые в спецификаторах использования, области действия ко­торых (спецификаторов) охватывают это место. Описанием, которое мо­жет быть сделано прямо видимым с помощью спецификатора использова­ния (потенциально видимое описание), является такое описание, которое находится непосредственно в видимом разделе одного из этих пакетов. По­тенциально видимое описание становится фактически прямо видимым, за исключением двух случаев:

• Потенциально видимое описание не становится прямо видимым, если рассматриваемое место программы находится в непосредственной области действия описания омографа.

• Потенциально видимые описания с одинаковыми идентификаторами не становятся прямо видимыми, если только каждое из них не является спецификацией литерала перечисления или описанием подпрограммы (пред­ставляющим собой описание подпрограммы, описание переименования, конкретизацию настройки или неявное описание).

Предвыполнение спецификатора использования не имеет другого эф­фекта.

Примечание. Приведенные выше правила гарантируют, что описание, которое ста­ло прямо видимым с помощью спецификатора использования, не может скрывать дру­гое прямо видимое описание. Эти правила сформулированы в терминах набора паке­тов, упомянутых в спецификаторах использования.

Следовательно, приведенные ниже строчки текста дают один и тот же эффект (в предположении существования единственного пакета Р).

use Р;

use Р; use Р, Р;

Пример противоречия имен в двух пакетах:

procedure R is

package ТРАФИК is

type ЦВЕТ is (КРАСНЫЙ, ЯНТАРНЫЙ, ЗЕЛЕНЫЙ) ;

end ТРАФИК;

package АКВАРЕЛИ is

type ЦВЕТ is (БЕЛЫЙ, КРАСНЫЙ, ЖЕЛТЫЙ, ЗЕЛЕНЫЙ, СИНИЙ, КОРИЧНЕВЫЙ, ЧЕРНЫЙ);

end АКВАРЕЛИ;

use ТРАФИК; - - ЦВЕТ, КРАСНЫЙ, ЯНТАРНЫЙ и ЗЕЛЕНЫЙ непосредственно - - видимы

use АКВАРЕЛИ; - - два омографа ЗЕЛЕНЫЙ непосредственно

  • - видимы, но ЦВЕТ не является более

  • - непосредственно видимым

subtype СВЕТ is ТРАФИК.ЦВЕТ; - - подтип использован

- - для разрешения противоречия, связанного с именем типа ЦВЕТ;

subtype ТЕНЬ is АКВАРЕЛИ.ЦВЕТ;

СИГНАЛ: СВЕТ;

КРАСКА : ТЕНЬ;

begin

СИГНАЛ: = ЗЕЛЕНЫЙ; - - из пакета ТРАФИК

КРАСКА: = ЗЕЛЕНЫЙ; - - из пакета АКВАРЕЛИ

endP;

Пример идентификации имени со спецификатором использования:

package Д is

Т, А, В: BOOLEAN;

end Д;

procedure Р is

package Е is

Б, С, В: INTEGER;

end E;

procedure H is

T, X: ВЕЩЕСТВ;

use Д, E;

begin

  • - имя Т означает Н.Т, а не Д.Т

  • - имя А означает Д.А

  • - имя Б означает Е.Б

  • - имя С означает Е.С

  • - имя X означает Н.Х

  • - имя В неправильно: должно быть использовано Д.В или Е.В

end Н;

begin

end Р;

  1. Описание переименования

Описание переименования задает другое имя для понятия.

описание_переименования : : =

идентификатор : обозначение_типа renames ямяобъскта;

  1. идентификатор : exception renames тля_исключения;

  1. package идентификатор renames имя_шкега;

I спецификация_подпрограммы renames имя^подпрограммы _или_ входа;

Предвыполнение описания переименования вычисляет имя, которое следует за резервированным словом renames, и, таким образом, определяет понятие, обозначенное этим именем (переименованное понятие). В любой точке, где описание переименования видимо, идентификатор или знак опе­рации, заданный в этом описании, обозначает переименованное понятие.

Первая форма описания переименования используется для переимено­вания объектов. Переименованное понятие должно быть объектом базово­го типа обозначения типа. Описание переименования не изменяет свойства переименованного объекта. В частности, описание переименования не ока­зывает влияния на значение объекта и на то, является ли он константой или нет; аналогично, переименование не затрагивает ограничения, накладывае­мые на объект (любое ограничение, которое следует из обозначения типа, входящего в описание переименования, игнорируется). Описание переиме­нования правильно только в том случае, если точно один объект имеет этот тип и может быть обозначен этим именем объекта.

Существуют следующие ограничения, связанные с переименованием подкомпонента переменной, которая зависит от дискриминантов. Переиме­нование недопустимо, если подтип переменной, как это определено в соот­ветствующем описании объекта, описании компонента или указании подти­па компонента, является неограниченным типом или, если переменная — это фбрмальный объект настройки (вида in out). Также, если переменная — формальный параметр, то переименование недопустимо, если заданное в спецификации параметра обозначение типа обозначает неограниченный тип, чьи дискриминанты имеют выражения по умолчанию.

Вторая форма описания переименования используется для переимено­вания исключений; третья форма — для переименования пакетов.

Последняя форма описания переименования используется для переиме­нования подпрограмм и входов. Переименованная подпрограмма или вход и спецификация подпрограммы, заданная в описании переименования, дол­жны иметь один и тот же профиль типа параметров и результата (см. разд. 6.6). Описание переименования правильно только в том случае, если точно одна видимая подпрограмма или вход удовлетворяют упомянутым выше требованиям и могут быть обозначены конкретным именем подпрограммы или входа. Кроме того, виды параметров должны совпадать с видами соот­ветствующих по позиции формальных параметров.

Переименование не оказывает влияния на подтипы параметров и ре­зультата (если он есть) переименованной подпрограммы или входа. Эти подтипы заданы в первоначальном описании подпрограммы, конкретизации настройки или описании входа (но не в описании переименования), а также для вызовов, которые используют новое имя. С другой стороны, описание переименования может вводить имена параметров и выражения по умолча­нию, которые отличаются от заданных для переименованной подпрограм­мы; именованные сопоставления в вызовах с новым именем подпрограм­мы должны использовать новое имя параметра; вызовы со старым именем подпрограммы должны использовать старые имена параметров.

Процедура может быть переименована только как процедура. Функция либо операция могут быть переименованы как функция либо как опера­ция; при переименовании функции или операции операцией спецификация подпрограммы, заданная в описании переименования, подчиняется прави­лам разд. 6.7 для описаний операции. Литералы перечисления могут быть переименованы как функции; аналогично, атрибуты, определенные как функции (такие как SUCC или PRED), могут быть переименованы как функции. Вход может быть переименован только как процедура; новое имя допускается только в контексте, допускающем имя процедуры. Вход из семейства может быть переименован, но семейство входов не может быть переименовано целиком.

Примеры:

declare

П: ПЕРСОНА renames КРАЙНЯЯ_ПЕРСОНА; - -см. 3.8.1 begin

П. ВОЗРАСТ: = П.ВОЗРАСТ +1;

end;

ПОЛНЫЙ: exception renames ТАБЛИЦА_УПРАВЛЕНИЯ. ТАБЛИЦА_ПОЛНОТЫ;

- - см. 7.5

package ТУ renames ТАБЛИЦА_УПРАВЛЕНИЯ;

function ВЕЩЕСТВ_ПЛЮС (ЛЕВЫЙ, ПРАВЫЙ: ВЕЩЕСТВ) return ВЕЩЕСТВ renames

function ЦЕЛ-ПЛЮС (ЛЕВЫЙ, ПРАВЫЙ: INTEGER) return INTEGER renames

function КРАСН-ФРАН return ЦВЕТ renames КРАСНЫЙ; - - см. 3.5.1

function КРАС-HEM return ЦВЕТ renames КРАСНЫЙ;

function КРАСН_ИТАЛ return ЦВЕТ renames КРАСН_ФРАН;

function СЛЕДУЮЩИЙ (X: ЦВЕТ) return ЦВЕТ renames ЦВЕТ'SUCC; - - см. 3.5.5 Примеры описания переименования с новыми именами параметров: function (X, Y: ВЕКТОР) return ВЕЩЕСТВ renames СКАЛ_ПРОИЗВЕДЕНИЕ; - - см. 6.1

Пример описания переименования с новым выражением по умолчанию:

function МИНИМУМ (А: СВЯЗЬ: = ГОЛОВА) return ЯЧЕЙКА renames

МИН ЯЧЕЙКА; - - см. 6.1

Примечание. Переименование может быть использовано для разрешения конф­ликта имея и для введения сокращений. Переименование другим идентификатором или символом операции не скрывает старое имя; новое и старое имя (символьная опе­рация) не обязательно видимы в одних и тех же точках. Атрибуты POS и VAL не могут быть переименованы, так как не могут быть написаны соответствующие специфика­ции; это положение справедливо для предопределенных мультипликативных опера­ций с результатом универсального -фиксированного типа.

Вызовы переименованного входа с новым именем являются операторами вызова процедуры и недопустимы в местах, где синтаксис требует оператора вызова входа в условном и временном вызовах входа; аналогично, атрибут COUNT нельзя применить к новому имени.

Объект задачного типа, описанный посредством описания объекта, может быть перейм енован как объект. Однако одиночная задача не может быть переименована, так как соответствующий заданный тип является анонимным. По тем же причинам не мо­жет быть переименован объект анонимного индексируемого типа. Не существует син­таксической формы для переименования настраиваемого модуля.

Для достижения эффекта переименования типа (включая задачный тип) может быть использован подтип, например:

subtype ВИД is ТЕХТ_ IO. FILE MODE;

  1. Стандартный пакет

Предопределенные типы (например, BOOLEAN, CHARACTER и INTE­GER) описаны в предопределенном пакете, называемом STANDARD; этот пакет включает также описания предопределенных для них операций. Пакет STANDARD описан в обязательном приложении 3. Спецификация пакета STANDARD, за исключением предопределенных числовых типов, должна быть одинаковой для всех реализаций языка.