Два описания, которые находятся непосредственно в одной и той же зоне описания, не должны быть омографами, за исключением тех случаев, когда выполнены одно или оба следующих требования:
только одно из них является неявным описанием предопределенной операции;
только одно из них является неявным описанием производной подпрограммы.
В таких случаях предопределенная операция всегда скрыта другим омографом производная подпрограмма скрывает предопределенную операцию, но скрыта сама любым другим омографом. Там, где скрытие осуществляется таким образом, неявное описание скрыто во всей области действия другого описания (независимо от того, какое описание стоит первым); неявное описание не видимо ни по имени, ни непосредственно.
Всегда, когда описание с определенным идентификатором видимо в данной точке, говорят, что идентификатор и описанное понятие (если оно есть) видимы в этой точке. Непосредственная видимость и видимость по имени для символьных литералов и знаков операции определяется аналогично. Операция, обозначенная знаком, непосредственно видима тогда и только тогда, когда описание соответствующей операции непосредственно видимо. Наконец, обозначения, связанные с базовой операцией, непосредственно видимы во всей области действия этой операции.
Пример:
procedure Р is
А, В: BOOLEAN;
procedure Q is
C: BOOLEAN;
BOOLEAN; - - внутренний омограф В
'begin
= А; - - означает Q.B: = Р.А;
= Р.В; - - означает 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 Р;
Описание переименования
Описание переименования задает другое имя для понятия.
описание_переименования : : =
идентификатор : обозначение_типа renames ямяобъскта;
идентификатор : exception renames тля_исключения;
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;
Стандартный пакет
Предопределенные типы (например, BOOLEAN, CHARACTER и INTEGER) описаны в предопределенном пакете, называемом STANDARD; этот пакет включает также описания предопределенных для них операций. Пакет STANDARD описан в обязательном приложении 3. Спецификация пакета STANDARD, за исключением предопределенных числовых типов, должна быть одинаковой для всех реализаций языка.