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

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

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

Синтаксис

aspect_specification ::=
with aspect_mark [=> aspect_definition] {,
aspect_mark [=> aspect_definition] }
aspect_mark ::= aspect_identifier['Class]
aspect_definition ::= name | expression | identifier

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

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

Правила допустимости

Если первая точка заморозки связанной сущности наступает до конца непосредственно содержащего списка объявлений, то каждое имя использования в aspect_definition должно разрешаться к той же сущности в первой точке заморозки, что и в конце непосредственно содержащего списка объявлений.
Разрешается не более одного вхождения каждого aspect_mark в одном aspect_specification. Идентифицируемый aspect_mark аспект должен быть аспектом, который может быть указан для связанной сущности (или представления сущности, определённой связанным объявлением).
aspect_definition, связанный с данным aspect_mark, может быть опущена только тогда, когда aspect_mark идентифицирует аспект типа boolean, в этом случае он эквивалентен aspect_definition, заданному как True.
Если aspect_mark включает 'Class, то связанная сущность должна быть помеченным типом или примитивной подпрограммой помеченного типа.
Нет определённых языком аспектов, которые могут быть заданы на renaming_declaration, generic_formal_parameter_declaration, subunit, package_body, task_body, protected_body или body_stub кроме subprogram_body_stub.
Определённый языком аспект не должен быть указан в aspect_specification, заданном на завершение подпрограммы или обобщённой подпрограммы.
Если аспект производного типа унаследован от типа предка и имеет булевое значение True, унаследованное значение не должно быть переопределено на значение False для производного типа, если не указано иначе в этом Международном стандарте.
Некоторые аспекты, связанные с типом, определены как непереопределяемые; все такие аспекты задаются с помощью aspect_definition, который является name.
Если непереопределяемый аспект задан непосредственно для типа T, то любое явное задание этого аспекта для любого другого потомка T должно быть подтверждающим; то есть, указанное name должно соответствовать унаследованному аспекту, что означает, что указанное name должно обозначать те же объявления, что и унаследованное name.
Если полный тип имеет частичное представление, и данный непереопределяемый аспект разрешён как для полного представления, так и для частичного представления, то данный аспект для частичного и полного представления должен быть одинаковым: аспект должен быть задан непосредственно только для частичного представления; если полный тип наследует аспект, то соответствующее определение должно быть задано (непосредственно или по наследованию) для частичного представления.
В дополнение к местам, где обычно применяются правила допустимости (см. 12.3), эти правила относительно непереопределяемых аспектов также применяются в частях «private» экземпляра обобщённого модуля.
Аспекты Default_Iterator, Iterator_Element, Implicit_Dereference, Constant_Indexing и Variable_Indexing являются непереопределяемыми.

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

В зависимости от идентифицированного аспекта aspect_mark, aspect_definition задаёт:
  • name, который обозначает подпрограмму, объект или другой вид сущности;
  • expression, который либо вычисляется для получения единственного значения, либо (как в предусловии) должен быть вычислен в определённые моменты во время последующего выполнения; или
  • identifier, специфичный для аспекта.
END_OF_DOCUMENT_MARKER
Определенный аспект связанного сущности, или в некоторых случаях, вид сущности, определенный декларацией, задается aspect_definition (или по умолчанию True, в случае булевых значений). Определяется, применяется ли aspect_specification к сущности или только к определённому виду сущности, заданному декларацией, с помощью aspect_mark и типа сущности. Следующие аспекты зависят от вида:
  • Аспект, заданный в object_declaration;
  • Аспект, заданный в subprogram_declaration;
  • Аспект, заданный в renaming_declaration.
Все остальные aspect_specifications связаны с сущностью и применяются ко всем видам сущности, если не указано иное в этом международном стандарте.
Если aspect_mark содержит 'Класс' (class-wide aspect), то, если не указано иное для конкретного аспекта класса:
  • если связанная сущность является помеченным типом, спецификация применяется ко всем потомкам типа;
  • если связанная сущность является примитивным подпрограммой помеченного типа T, спецификация применяется к соответствующей примитивной подпрограмме всех потомков T.
Все специфицируемые операционные и представительные атрибуты могут быть указаны с помощью aspect_specification вместо attribute_definition_clause (см. 13.3).
Любой аспект, заданный с помощью прагмы представления или прагмы единицы библиотеки, имеющей local_name в качестве единственного аргумента, может быть задан с помощью aspect_specification, при этом сущностью будет local_name. Ожидается, что aspect_definition будет типа Boolean. Выражение должно быть статическим. Несмотря на то, что этот международный стандарт говорит об ином, выражение аспекта, который может быть задан прагмой единицы библиотеки, разрешается и оценивается в момент его появления в aspect_specification, а не в первой точке заморозки связанного пакета.
Кроме того, могут быть указаны и другие операционные и представительные аспекты, не связанные со специфицируемыми атрибутами или прагмами представления, как указано в другом месте в этом международном стандарте.
Этот абзац был удален.
Если Правило правомерности или Правило статической семантики применяется только при указании конкретного аспекта, то аспект считается заданным только тогда, когда aspect_specification или attribute_definition_clause видимы (см. 8.3) в момент применения правила.
Альтернативные правила правомерности и семантики могут применяться для конкретных аспектов, как указано в другом месте в этом международном стандарте.

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

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

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

Реализации могут поддерживать определённые в реализации аспекты. aspect_specification для аспекта, определённого в реализации, может использовать определяемую реализацией синтаксис для aspect_definition, и может следовать правилам правомерности и семантики, определяемым реализацией.


Spec-Zone.ru

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