Spec-Zone.ru › Ada 2022
Руководство по Ada (Ada 2022)

6.3.1 Правила соответствия

Когда профили подпрограмм задаются более чем в одном месте, они должны соответствовать одному из четырёх способов: соответствию по типу, соответствию по режиму, соответствию по подтипу или полному соответствию.

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

Как объяснено в B.1, «Аспекты интерфейса», для сущности можно указать конвенцию. Если в этом документе не указано иное, по умолчанию конвенцией сущности является Ada. Для вызываемой сущности или типа доступа к подпрограмме конвенция называется конвенцией вызова. Следующие конвенции определены языком:
  • Конвенция вызова по умолчанию для любой подпрограммы, не указанной ниже, является Ada. Аспект Convention может быть указан для переопределения конвенции вызова по умолчанию (см. B.1).
  • Конвенция вызова Intrinsic представляет подпрограммы, «встроенные» в компилятор. Конвенция вызова по умолчанию является Intrinsic для следующего:
перечисление литерала;
оператор "/=", объявленный неявно из-за объявления "=" (см. 6.6);
любая другая неявно объявленная подпрограмма, если это не операция диспетчеризации помеченного типа;
унаследованная подпрограмма формального помеченного типа обобщения с неизвестными дискриминантами;
атрибут, являющийся подпрограммой;
подпрограмма, объявленная непосредственно в protected_body;
любой префиксный вид подпрограммы (см. 4.1.3) без вида синхронизации (см. 9.5) By_Entry или By_Protected_Procedure.
Атрибут Access не разрешён для подпрограмм Intrinsic.
  • Конвенция вызова по умолчанию — protected для защищенной подпрограммы, для префиксного вида подпрограммы с видом синхронизации By_Protected_Procedure и для типа доступа к подпрограмме со служебным словом protected в её определении.
  • Конвенция вызова по умолчанию — entry для входа и для префиксного вида подпрограммы с видом синхронизации By_Entry.
  • Конвенция вызова для анонимного параметра доступа к подпрограмме или анонимного результата доступа к подпрограмме — protected, если служебное слово protected присутствует в её определении; в противном случае — конвенция сущности, которая имеет параметр или результат, если у этой сущности не установлена конвенция protected, entry или Intrinsic, в таком случае конвенция — Ada.
  • Если не указано как Intrinsic, конвенция вызова для любой унаследованной или переопределяющей операции диспетчеризации помеченного типа — та же, что и у соответствующей подпрограммы родительского типа. Конвенция вызова по умолчанию для новой операции диспетчеризации помеченного типа — конвенция типа.
Из этих четырёх конвенций только Ada и Intrinsic разрешены в качестве convention_identifier при указании аспекта Convention.
Два профиля соответствуют по типу, если у них одинаковое количество параметров, и у обоих есть результат, если у любого из них есть результат, и соответствующие типы параметров и результатов совпадают, или, для параметров или результатов доступа, соответствующие обозначенные типы совпадают, или соответствующие обозначенные профили соответствуют по типу.
Два профиля соответствуют по режиму, если:
  • они соответствуют по типу; и
  • соответствующие параметры имеют одинаковые режимы и оба или ни один из них не являются явно алиасовыми параметрами; и
  • для соответствующих параметров доступа и любого типа результата доступа обозначенные подтипы статически совпадают, и оба или ни один из них не являются доступами к константе, или обозначенные профили соответствуют по подтипу.
Два профиля соответствуют по подтипу, если они соответствуют по режиму, соответствующие подтипы профиля статически совпадают, и связанные конвенции вызова совпадают. Профиль формальной подпрограммы обобщения не соответствует по подтипу ни одному другому профилю.
Два профиля полностью соответствуют, если они соответствуют по подтипу, если у них есть результаты доступа к подпрограммам, чьи обозначенные профили полностью соответствуют, и для соответствующих параметров:
  • они имеют одинаковые имена; и
  • оба или ни один из них не имеют null_exclusions; и
  • ни у кого нет default_expressions, или у обоих есть default_expressions, которые полностью соответствуют друг другу; и
  • для параметров доступа к подпрограмме обозначенные профили полностью соответствуют.
Два выражения полностью соответствуют, если после замены каждого использования оператора эквивалентным function_call:
  • каждый составляющий конструкт одного соответствует экземпляру той же синтаксической категории в другом, за исключением того, что расширенное имя может соответствовать direct_name (или character_literal) или другому расширенному имени в другом; и
  • соответствующие defining_identifiers, встречающиеся в двух выражениях, одинаковы; и
  • каждое direct_name, character_literal и selector_name, которое не является частью prefix расширенного имени в одном, обозначает ту же декларацию, что и соответствующее direct_name, character_literal или selector_name в другом, или они обозначают соответствующие декларации, встречающиеся в двух выражениях; и
  • каждый attribute_designator в одном такой же, как соответствующий attribute_designator в другом; и
  • каждый primary, который является литералом в одном, является пользовательским литералом тогда и только тогда, когда соответствующий литерал в другом также является пользовательским литералом. Кроме того, если ни один из них не является пользовательским литералом, то они должны иметь те же значения, но могут иметь разные текстовые представления; если оба являются пользовательскими литералами, то они должны иметь одинаковое текстовое представление.
Два known_discriminant_parts полностью соответствуют, если у них одинаковое количество дискриминантов, и дискриминанты в одних и тех же позициях имеют одинаковые имена, статически соответствующие подтипы и default_expressions, которые полностью соответствуют друг другу.
Два discrete_subtype_definitions полностью соответствуют, если они оба являются subtype_indications или оба являются ranges, subtype_marks (если есть) обозначают тот же подтип, и соответствующие simple_expressions ranges (если есть) соответствуют полностью.
Префиксный вид профиля подпрограммы — профиль, полученный путём опущения первого параметра этой подпрограммы. Для беспараметрической подпрограммы нет префиксного вида профиля. Для определения соответствия по подтипу и режиму конвенция префиксного вида профиля считается соответствующей конвенции либо входа, либо защищённой операции.

Разрешения для реализации

Реализация может объявить оператор, объявленный в библиотечном модуле языка, встроенным.
ПРИМЕЧАНИЕ Любые требования к соответствию между aspect_specifications, которые являются частью профиля или known_discriminant_part, определяются семантикой каждого конкретного аспекта. В частности, нет общего требования, чтобы aspect_specifications соответствовали в согласующихся профилях или частях дискриминантов.


Spec-Zone.ru

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