Spec-Zone.ru › Ada 2005
Справочное руководство Ada 2005

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

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

Синтаксис

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

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

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

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

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

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

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

Примеры

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





Spec-Zone.ru

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