Статус документа
Статус документа

ГОСТ 27831-88 (ИСО 8652-87) Язык программирования АДА

     4.3. Агрегаты


Агрегат - это базовая операция, которая объединяет значения компонентов в составное значение именуемого или индексируемого типа.

агрегат : : = (сопоставление_компонентов

{ , сопоставление_компонентов } )

сопоставление_компонентов : : = [выбор { выбор} = > ] выражение


Каждое сопоставление компонентов связывает выражение с компонентами. Сопоставление компонентов называется именованным, если компоненты явно определены выборами, и позиционным в противном случае. При позиционном сопоставлении каждому отдельно взятому компоненту неявно соответствует некоторая позиция: именуемым компонентам - в порядке следования их описаний, индексируемым компонентам - по возрастанию индекса.

Именованные сопоставления могут стоять в произвольном порядке (исключая выбор 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. Агрегаты массивов