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

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

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

Синтаксис

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

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

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

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

Если тип агрегата_записи — расширение записи, то он должен быть потомком типа записи, через одно или несколько расширений записей (и без частных расширений).
Ключевые слова пустая_запись могут появиться только в том случае, если в данном списке_ассоциаций_компонентов_записи нет необходимых компонентов.
Каждая ассоциация_компонента_записи, кроме выбора другие с <>, должна иметь как минимум один соответствующий компонент, и каждый необходимый компонент должен быть связан ровно с одной ассоциацией_компонента_записи. Если ассоциация_компонента_записи с выражением имеет два или более соответствующих компонента, все они должны быть одного типа или все должны быть анонимными типами доступа, подтипы которых статически совпадают. Кроме того, правила легальности применяются отдельно для каждого соответствующего компонента.
Значение дискриминанта, управляющего частью_варианта P, должно быть задано статическим выражением, если только P не вложен в вариант V, который не выбирается значением дискриминанта, управляющего частью_варианта, содержащей V.
Ассоциация_компонента_записи для дискриминанта без выражения_по_умолчанию должна содержать выражение, а не <>.

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

Вычисление агрегата_записи состоит из вычисления списка_ассоциаций_компонентов_записи.
При вычислении списка_ассоциаций_компонентов_записи все ограничения на объекты (см. 3.8) для компонентов, указанных в списке ассоциаций, уточняются, а все выражения оцениваются и преобразуются в подтип соответствующего компонента. Любые уточнения ограничений и оценки выражений (и преобразования) происходят в произвольном порядке, за исключением того, что выражение для дискриминанта вычисляется (и преобразуется) до уточнения любых ограничений на объект, которые зависят от него, что, в свою очередь, происходит до вычисления и преобразования выражения для компонента с ограничением на объект.
Для ассоциации_компонента_записи с выражением выражение определяет значение для соответствующего компонента(ов). Для ассоциации_компонента_записи с <>, если в объявлении_компонента есть выражение_по_умолчанию, это выражение_по_умолчанию определяет значение для соответствующего компонента(ов); в противном случае, соответствующий компонент(ы) инициализируются по умолчанию как для автономного объекта подтипа компонента (см. 3.3.1).
Выражение выражение ассоциации_компонента_записи оценивается (и преобразуется) один раз для каждого соответствующего компонента.
ПРИМЕЧАНИЯ
8 Для агрегата_записи с позиционными ассоциациями, выражения, определяющие значения дискриминантов, появляются первыми, поскольку известная_часть_дискриминантов задаётся первой в объявлении типа; они должны быть в том же порядке, что и в известная_часть_дискриминантов.

Примеры

Пример агрегата записи с позиционными ассоциациями:
(4, Июль, 1776) -- см. 3.8
Примеры агрегатов записей с именованными ассоциациями:
(День => 4, Месяц => Июль, Год => 1776)
(Месяц => Июль, День => 4, Год => 1776)
(Диск, Закрыт, Дорожка => 5, Цилиндр => 12) -- см. 3.8.1
(Единица => Диск, Состояние => Закрыт, Цилиндр => 9, Дорожка => 1)
Примеры ассоциаций компонентов с несколькими вариантами:
(Значение => 0, Успех|Предыдущий => новый Ячейка'(0, пустой, пустой)) -- см. 3.10.1
-- Аллокатор вычисляется дважды: Успех и Предыдущий обозначают разные ячейки
(Значение => 0, Успех|Предыдущий => <>) -- см. 3.10.1
END_OF_DOCUMENT_MARKER ```
-- Succ и Pred будут установлены в null
Примеры агрегатов записей для помеченных типов (см. 3.9 и 3.9.1):
Expression'(null record)
Literal'(Значение => 0.0)
Painted_Point'(0.0, Pi/2.0, Paint => Красный)


Spec-Zone.ru

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