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

4.3.1 Агрегаты записей

В агрегате записи значение задается для каждого компонента записи или значения расширения записи с использованием именованной или позиционной ассоциации.

Синтаксис

record_aggregate ::= (record_component_association_list)
record_component_association_list ::=
record_component_association {, record_component_association}
| null record
record_component_association ::=
[ component_choice_list => ] expression
component_choice_list ::=
имя_компонентаselector_name {| имя_компонентаselector_name}
| others
Ассоциация record_component_association является именованной ассоциацией компонента, если она имеет component_choice_list; в противном случае это позиционная ассоциация компонента. Любые позиционные ассоциации компонентов должны предшествовать любым именованным ассоциациям. Если есть именованная ассоциация с component_choice_list others, она должна стоять последней.
В списке record_component_association_list для агрегата record_aggregate, если существует только одна ассоциация, она должна быть именованной ассоциацией.

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

Ожидаемый тип для агрегата record_aggregate должен быть одним нелимитированным типом записи или расширением записи.
Для списка record_component_association_list агрегата record_aggregate все компоненты составного значения, определенного агрегатом, являются необходимыми; для списка ассоциаций агрегата extension_aggregate необходимы только те компоненты, которые не определены выражением предка или типом подтипа (см. 4.3.2). Каждое selector_name в record_component_association должно обозначать необходимый компонент (включая, возможно, дискриминант).
Ожидаемый тип для expression в record_component_association — это тип соответствующего компонента(ов); соответствующие компонент(ы) следующие:
  • Для позиционной ассоциации — компонент (включая, возможно, дискриминант) в соответствующей относительной позиции (в области объявления типа), учитывая только необходимые компоненты;
  • Для именованной ассоциации с одним или несколькими component_selector_name — соответствующий(ие) именованный(ые) компонент(ы);
  • Для именованной ассоциации со служебным словом others — все необходимые компоненты, не связанные с какой-либо предыдущей ассоциацией.

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

Если тип record_aggregate — расширение записи, то он должен быть потомком типа записи через одно или несколько расширений записи (и без частных расширений).
Если в данном списке record_component_association_list нет необходимых компонентов, то вместо списка record_component_association должно использоваться служебное слово null record.
Каждая record_component_association должна иметь как минимум один связанный компонент, и каждый необходимый компонент должен быть связан ровно с одной record_component_association. Если record_component_association имеет два или более связанных компонента, все они должны быть одного типа.
Если компоненты variant_part являются необходимыми, то значение дискриминанта, управляющего variant_part, должно быть задано статическим выражением.

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

Вычисление record_aggregate состоит из вычисления record_component_association_list.
Для вычисления record_component_association_list все ограничения на объект (см. 3.8) для компонентов, указанных в списке ассоциации, обрабатываются, и вычисляются все expressionы, и преобразуются в подтип соответствующего компонента. Любые обработки ограничений и вычисления expression (и преобразования) происходят в произвольном порядке, за исключением того, что expression для дискриминанта вычисляется (и преобразуется) до обработки любого ограничения на объект, зависящего от него, которое, в свою очередь, происходит до вычисления и преобразования expression для компонента с ограничением на объект.
expression ассоциации record_component_association вычисляется (и преобразуется) один раз для каждого связанного компонента.
ПРИМЕЧАНИЯ
7 Для record_aggregate с позиционными ассоциациями выражения, задающие значения дискриминантов, появляются первыми, так как known_discriminant_part задается первой в объявлении типа; они должны быть в том же порядке, что и в known_discriminant_part.

Примеры

Пример агрегата записи с позиционными ассоциациями:
(4, Июль, 1776) -- см. 3.8
Примеры агрегатов записей с именованными ассоциациями:
(День => 4, Месяц => Июль, Год => 1776)
(Месяц => Июль, День => 4, Год => 1776)
(Диск, Закрытый, Дорожка => 5, Цилиндр => 12) -- см. 3.8.1
(Единица => Диск, Статус => Закрытый, Цилиндр => 9, Дорожка => 1)
Пример ассоциации компонента с несколькими вариантами:
(Значение => 0, След|Пред => новый Ячейка'(0, null, null)) -- см. 3.10.1
-- Распределитель вычисляется дважды: След и Пред обозначают разные ячейки
Примеры агрегатов записей для типов с метками (см. 3.9 и 3.9.1):
Выражение'(null record)
Литерал'(Значение => 0.0)
Точка_с_закраской'(0.0, Пи/2.0, Цвет => Красный)


Spec-Zone.ru

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