Spec-Zone.ru › Ada 2022
Справочник по Ada (Ada 2022)

13.1.1 Спецификации аспектов

Определённые аспекты представления или работы сущности могут быть указаны в её объявлении с помощью спецификации_аспекта, а не с помощью отдельного элемента представления или работы. Объявление со спецификацией_аспекта называется связанным объявлением.

Синтаксис

спецификация_аспекта ::=
with метка_аспекта [=> определение_аспекта] {,
метка_аспекта [=> определение_аспекта] }
метка_аспекта ::= аспект_идентификатор['Class]
определение_аспекта ::=
имя | выражение | идентификатор
| агрегат | глобальное_определение_аспекта

Правила разрешения имён

Метка_аспекта определяет аспект сущности, определённой связанным объявлением (связанная сущность); аспект обозначает объект, значение, выражение, агрегат, подпрограмму или какой-либо другой тип сущности. Если метка_аспекта определяет:
  • аспект, обозначающий объект, определение_аспекта должно быть именем. Ожидаемый тип для имени — это тип указанного аспекта связанной сущности;
  • аспект, являющийся значением или выражением, определение_аспекта должно быть выражением. Ожидаемый тип для выражения — это тип указанного аспекта связанной сущности;
  • аспект, являющийся агрегатом, определение аспекта должно быть выражением, являющимся агрегатом с формой агрегата, определённой указанным аспектом;
  • аспект, обозначающий подпрограмму, определение_аспекта должно быть именем; ожидаемый профиль для имени — это профиль, требуемый для аспекта связанной сущности;
  • аспект, обозначающий другую сущность, определение_аспекта должно быть именем, и имя должно разрешаться в обозначение сущности соответствующего типа;
  • аспект, заданный идентификатором, специфичным для аспекта, определение_аспекта должно быть идентификатором, и идентификатор должен быть одним из идентификаторов, специфичных для указанного аспекта.
Имена, используемые в определении_аспекта, связанном с объявлением, не разрешаются в момент связанного объявления, а скорее разрешаются в конце непосредственно окружающего списка объявлений или, в случае объявления библиотечного блока, в конце видимой части сущности.
Если связанное объявление предназначено для подпрограммы, входа или типа доступа к подпрограмме, имена формальных параметров непосредственно видны внутри определения_аспекта, как и некоторые атрибуты, как указано в другом месте этого документа для указанного аспекта. Если связанное объявление является объявлением_типа, в определении_аспекта имена любых видимых компонентов, защищённых подпрограмм и входов непосредственно видны, а имя первого подтипа обозначает текущий экземпляр типа (см. 8.6). Если связанное объявление является объявлением_подтипа, в определении_аспекта имя нового подтипа обозначает текущий экземпляр подтипа.

Правила легальности

Если первая точка заморозки связанной сущности наступает до конца непосредственно окружающего списка объявлений, каждое используемое имя в определении_аспекта должно разрешаться на ту же сущность в первой точке заморозки, что и в конце непосредственно окружающего списка объявлений.
Выражение или имя, вызывающие заморозку сущности, не должны встречаться в спецификации_аспекта, которая указывает аспект представления или работы этой сущности.
Допускается не более одного вхождения каждого метки_аспекта в одной спецификации_аспекта. Аспект, идентифицированный меткой_аспекта, должен быть аспектом, который может быть указан для связанной сущности (или представления сущности, определённой связанным объявлением).
Определение_аспекта, связанное с данной меткой_аспекта, может быть опущено только тогда, когда метка_аспекта идентифицирует аспект типа boolean, в этом случае это эквивалентно тому, что определение_аспекта задано как True.
Если метка_аспекта включает 'Class, то связанная сущность должна быть помеченным типом или примитивной подпрограммой помеченного типа.
Если не указано иное для конкретного аспекта, определяемый языком аспект не может быть указан на объявлении_переименования или объявлении_формального_параметра_генератора.
Если не указано иное, определяемый языком аспект не должен быть указан в спецификации_аспекта, заданной при завершении блока программы.
Если аспект производного типа унаследован от родительского типа и имеет булево значение True, унаследованное значение не должно быть переопределено в значение False для производного типа, если в этом документе не указано иное.
Если данный аспект связан с типом и унаследован, то в определении_аспекта для аспекта, если имя разрешается на обозначение нескольких видимых подпрограмм, все или ни одна из подпрограмм не должны быть примитивами связанного типа.
Определенные связанные с типом аспекты определяются как непереопределяемые; все такие аспекты наследуются производными типами в соответствии с правилами, приведенными в 13.1. Любое правило легальности, связанное с непереопределяемым аспектом, проверяется повторно для производного типа, если производный тип не абстрактный. Некоторые связанные с типом и подтипом аспекты определяются как аддитивные; такие аспекты не наследуются, но они могут применяться к типам, полученным из, или подтипам, основанным на исходном типе или подтипе, как определено для каждого такого аспекта. Наконец, некоторые связанные с типом аспекты неявным образом комбинируются; такие аспекты не наследуются, а вместо этого предоставляется реализация по умолчанию для производного типа, как определено для каждого аспекта, на основе родительского типа, предполагая, что аспект родительского типа доступен при объявлении производного типа, плюс аспекты любых новых компонентов, добавленных в качестве части расширения типа.
Если для типа T непосредственно указан неизменяемый аспект, то любое явное указание этого аспекта для любого потомка T (кроме самого T) будет соответствующим. В случае аспекта, являющегося именем, это означает, что указанное имя должно совпадать с унаследованным аспектом в том смысле, что оно должно обозначать те же объявления, что и унаследованное имя. Аналогично, для аспекта, являющегося выражением или агрегатом, соответствие означает, что определяющее выражение полностью соответствует (см. 6.3.1) определяющему выражению для унаследованного аспекта, с добавлением правила, что идентификатор, специфичный для аспекта, такой же, как соответствующий идентификатор в унаследованном аспекте.
Если у полного типа есть частичный вид, и для полного вида, и для частичного вида разрешен данный неизменяемый аспект, то данный аспект для частичного вида и полного вида должен быть одинаковым: аспект должен быть указан непосредственно только для частичного вида; если полный тип наследует аспект, то для частичного вида должно быть указано соответствующее определение (непосредственно или по наследованию).
Если тип наследует неизменяемый аспект от нескольких предков, значение аспекта, унаследованного от любого данного предка, должно быть подтверждающим значения, унаследованные от всех остальных предков.
Помимо мест, где обычно применяются Правила законности (см. 12.3), эти правила об неизменяемых аспектах также применяются в частях экземпляра универсального блока.

Статическая семантика

В зависимости от того, какой аспект идентифицируется меткой_аспекта, определение_аспекта задаёт:
  • имя, которое обозначает подпрограмму, объект или другой вид сущности;
  • выражение (кроме агрегата), которое либо вычисляется для получения единственного значения, либо (например, в предопределении) должно вычисляться в определённые моменты во время последующего выполнения;
  • идентификатор, специфичный для аспекта; или
  • агрегат, позиционный или именованный, состоящий из элементов любого из этих четырёх видов конструкций.
Идентифицированный аспект связанной сущности, или в некоторых случаях, вид сущности, определённый объявлением, задаётся определением_аспекта (или по умолчанию True для булевых значений). Определяется ли указание_аспекта для сущности или только для определённого вида сущности, определяется меткой_аспекта и типом сущности. Следующие аспекты зависят от вида:
  • Аспект, указанный в объявлении_объекта;
  • Аспект, указанный в объявлении_подпрограммы;
  • Аспект, указанный в объявлении_переименования.
Все остальные указания_аспектов связаны с сущностью и применимы ко всем видам сущности, если не указано иное в этом документе.
Если метка_аспекта включает 'Класс (аспект_класса), то, если не указано иное для конкретного аспекта класса:
  • если связанная сущность — это помеченный тип, указание применимо ко всем потомкам типа;
  • если связанная сущность — это примитивная подпрограмма помеченного типа T, указание применимо к соответствующей примитивной подпрограмме всех потомков T.
Все определяемые операционные и представленческие атрибуты могут быть указаны с помощью указания_аспекта вместо определения_атрибута_клауза (см. 13.3).
Некоторые аспекты определены как аспекты_библиотечных_единиц. Аспекты библиотечных единиц имеют тип Булево. Выражение, задающее аспект библиотечной единицы, должно быть статическим. Аспекты библиотечных единиц определены для всех программных единиц, но должны быть указаны только для библиотечных единиц. Несмотря на то, что в этом документе сказано иначе, выражение аспекта библиотечной единицы разрешается и вычисляется в точке, где оно встречается в указании_аспекта, а не в первой точке заморозки связанной единицы.
Кроме того, могут быть указаны и другие операционные и представленческие аспекты, не связанные с определяемыми атрибутами или распоряжениями представлений, как указано в другом месте этого документа.
Этот абзац был удалён.
Если правило законности или правило статической семантики применимо только при указании определенного аспекта, аспект считается указанным только тогда, когда указание_аспекта или определение_атрибута_клауза видимы (см. 8.3) в момент применения правила.
Альтернативные правила законности и семантики могут применяться для отдельных аспектов, как указано в другом месте данного документа.

Динамическая семантика

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

Разрешения для реализации

Реализации могут поддерживать аспекты, определённые реализацией. Указание_аспекта для аспекта, определённого реализацией, может использовать определённый реализацией синтаксис для определения_аспекта и может следовать правилам законности и семантики, определённым реализацией.
Реализация может игнорировать указание нераспознанного аспекта; если реализация выбирает игнорировать такое указание аспекта (в отличие от его отклонения), то это не оказывает влияния на семантику программы, кроме, возможно (и это не требуется), отклонения синтаксических ошибок в рамках определения_аспекта.


Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API