Агрегат - это базовая операция, которая объединяет значения компонентов в составное значение именуемого или индексируемого типа.
агрегат : : = (сопоставление_компонентов | ||||
{ , сопоставление_компонентов } ) | ||||
сопоставление_компонентов : : = [выбор { выбор} = > ] выражение |
Каждое сопоставление компонентов связывает выражение с компонентами. Сопоставление компонентов называется именованным, если компоненты явно определены выборами, и позиционным в противном случае. При позиционном сопоставлении каждому отдельно взятому компоненту неявно соответствует некоторая позиция: именуемым компонентам - в порядке следования их описаний, индексируемым компонентам - по возрастанию индекса.
Именованные сопоставления могут стоять в произвольном порядке (исключая выбор others), но если в агрегате одновременно используются позиционные и именованные сопоставления, то первыми должны стоять позиционные сопоставления, каждое на своем месте. Следовательно, за именованными сопоставлениями в агрегате должны следовать только именованные сопоставления. В агрегатах, содержащих единственное сопоставление, должно всегда использоваться именованное сопоставление. Правила для сопоставления компонентов агрегатов именуемого типа и агрегатов индексируемого типа определены в разд.4.3.1 и 4.3.2.
Синтаксис выборов сопоставления компонентов совпадает с синтаксисом разделов вариантов (см. 3.7.3). Выбор, являющийся простым именем компонента, допустим только в агрегатах именуемого типа. Выбор, являющийся простым выражением или дискретным диапазоном, допустим только в агрегатах индексируемого типа; выбор, являющийся простым выражением, задает значение индекса; дискретный диапазон задает диапазон значений индекса. Выбор others допустим только в последнем сопоставлении компонентов в качестве единственного выбора и определяет все оставшиеся компоненты, если они есть.
Каждый компонент значения, определяемого агрегатом, должен встретиться в агрегате один и только один раз. Следовательно, каждый агрегат должен быть полным и не допускается, чтобы данный компонент был задан более чем одним выбором.
Тип агрегата должен быть определимым исключительно по контексту, в котором встречается агрегат, без учета самого агрегата, используя только тот факт, что его тип должен быть составным и не лимитируемым. Тип агрегата в свою очередь определяет требуемый тип каждого его компонента.
Примечание. Приведенное выше правило означает, что для определения типа агрегата не может быть использована информация, которую несет в себе агрегат. В частности, это определение не может использовать тип выражения в сопоставлении компонентов, формы или типы выборов. Агрегат с одним компонентом всегда можно отличить от выражения, заключенного в скобки, благодаря обязательному именованию компонента такого агрегата.
4.3.1. Агрегаты записей
Для агрегата именуемого типа (агрегата записи) имена компонентов, заданные выборами, должны обозначать компоненты (включая дискриминанты) именуемого типа. Выбор others в агрегатах записей должен представлять хотя бы один компонент. Сопоставление компонентов с выбором others или более чем с одним выбором допускается только тогда, когда представленные компоненты имеют один и тот же тип. Выражение в сопоставлении компонентов должно иметь тип соответствующего компонента записи.
Значение, определяющее дискриминант, должно быть задано статическим выражением (заметим, что это значение определяет, какие из зависимых компонентов должны присутствовать в значении записи).
При вычислении агрегатов записи порядок вычисления выражений в сопоставлениях компонентов в языке не определен. Выражение в именованном сопоставлении вычисляется один раз для каждого сопоставленного компонента. Производится проверка на принадлежность значения каждого подкомпонента агрегата подтипу этого подкомпонента. При отрицательном результате проверки возбуждается исключение CONSTRAINT_ERROR.
Пример агрегата записи с позиционным сопоставлением:
(4, ИЮЛЬ, 1776) - - см. 3.7
Примеры агрегатов записи с именованными сопоставлениями:
(ДЕНЬ => 4, МЕСЯЦ => ИЮЛЬ, ГОД => 1776)
(МЕСЯЦ => ИЮЛЬ, ДЕНЬ => 4, ГОД => 1776)
(ДИСК, ЗАКРЫТ, ТРАКТ = > 5, ЦИЛИНДР => 12) - - см. 3.7.3
(УСТРОЙСТВО => ДИСК, СОСТОЯНИЕ => ЗАКРЫТ, ЦИЛИНДР => 9, ТРАКТ => 1)
Примеры сопоставления компонентов с несколькими выборами:
(ЗНАЧЕНИЕ => 0, СЛЕД ПРЕД => new ЯЧЕЙКА' (0, null, null)) - - см. 3.8.1
- - генератор вычисляется дважды: СЛЕД и ПРЕД обозначают разные ячейки
Примечание. В агрегате с позиционными сопоставлениями первыми идут значения дискриминантов, так как раздел дискриминантов идет первым в описании именуемого типа; они должны быть в том же порядке, что и в разделе дискриминантов.
4.3.2. Агрегаты массивов