Справочник по Ada 95
3.7.1 Ограничения на дискриминанты
discriminant_constraint определяет значения дискриминант для данного дискриминированного типа.
Синтаксис
discriminant_constraint ::=
(discriminant_association {, discriminant_association})
(discriminant_association {, discriminant_association})
discriminant_association ::=
[discriminant_selector_name {| discriminant_selector_name} =>] expression
[discriminant_selector_name {| discriminant_selector_name} =>] expression
discriminant_association называется именованной, если она содержит один или несколько discriminant_selector_name; в противном случае она называется позиционной. В discriminant_constraint все позиционные ассоциации должны предшествовать именованным ассоциациям.
Правила разрешения имен
Каждый selector_name именованной discriminant_association должен ссылаться на дискриминант подтипа, к которому применяется ограничение; дискриминанты, таким образом названные, являются связанными дискриминантами именованной ассоциации. Для позиционной ассоциации связанным дискриминантом является тот, чья discriminant_specification появилась в соответствующей позиции в known_discriminant_part, которая определяла дискриминанты подтипа, к которому применяется ограничение.
Ожидаемый тип для expression в discriminant_association соответствует типу связанного дискриминанта(ов).
Правила легальности
discriminant_constraint разрешается только в subtype_indication, где subtype_mark обозначает либо не ограниченный дискриминированный подтип, либо не ограниченный подтип доступа, чьей целевой подтип является не ограниченный дискриминированный подтип. Однако в случае общего подтипа доступа discriminant_constraint не допускается, если где-то в непосредственном объеме целевого подтипа ограничен вид целевого подтипа.
Именованная discriminant_association с более чем одним selector_name разрешена только если все перечисленные дискриминанты имеют один и тот же тип. discriminant_constraint должен предоставлять ровно одно значение для каждого дискриминанта ограниченного подтипа.
expression связанный с дискриминантом доступа должен быть типа, конвертируемого в анонимный тип доступа.
Динамическая семантика
discriminant_constraint совместим с не ограниченным дискриминированным подтипом, если каждое значение дискриминанта принадлежит подтипу соответствующего дискриминанта.
Составное значение удовлетворяет ограничению дискриминанта тогда и только тогда, когда каждый дискриминант составного значения имеет значение, заданное ограничением дискриминанта.
При обработке discriminant_constraint, expression в discriminant_association вычисляются в произвольном порядке и преобразуются к типу связанного дискриминанта (что может вызвать Constraint_Error — см. 4.6); expression именованной ассоциации вычисляется (и преобразуется) один раз для каждого связанного дискриминанта. Результат каждого вычисления и преобразования — значение, налагаемое ограничением для соответствующего дискриминанта.
ПРИМЕЧАНИЯ
54 Правила языка гарантируют, что дискриминант объекта всегда имеет значение, либо явным, либо неявным образом инициализированное.
Примеры
Примеры (используя типы, объявленные выше в пункте 3.7):
Large : Buffer(200); -- ограниченное, всегда 200 символов
-- (явное значение дискриминанта)
Message : Buffer; -- неограниченное, по умолчанию 100 символов
-- (значение дискриминанта по умолчанию)
Basis : Square(5); -- ограниченное, всегда 5 на 5
Illegal : Square; -- не допускается, Square должен быть ограниченным
-- (явное значение дискриминанта)
Message : Buffer; -- неограниченное, по умолчанию 100 символов
-- (значение дискриминанта по умолчанию)
Basis : Square(5); -- ограниченное, всегда 5 на 5
Illegal : Square; -- не допускается, Square должен быть ограниченным