Руководство по Ada (Ada 2022)
7.3.4 Стабильные свойства типа
Определённые характеристики объекта заданного типа не изменяются большинством примитивных операций типа. Такие характеристики называются стабильными свойствами типа.
Статическая семантика
Функция свойства типа T — это функция с одним параметром типа T или типа класса, охватывающего T.
Определение аспекта свойства типа — это список имен, записанных в синтаксисе позиционного агрегата массива. Определение аспекта свойства подпрограммы — это список имен, каждый из которых необязательно предваряется ключевым словом not, также записанных в синтаксисе позиционного агрегата массива.
Для неформального частного типа, неформального частного расширения или полного типа, не имеющего частичного представления, следующие определяемые языком аспекты могут быть указаны с помощью указания аспекта (см. 13.1.1):
Stable_Properties
Этот аспект должен быть указан с помощью определения аспекта свойства типа; каждое имя должно статически обозначать одну функцию свойства типа. Этот аспект определяет конкретные функции стабильного свойства связанного типа.
Stable_Properties'Class
Этот аспект должен быть указан с помощью определения аспекта свойства типа; каждое имя должно статически обозначать одну функцию свойства типа. Этот аспект определяет функции стабильного свойства класса связанного типа. В отличие от большинства аспектов класса, Stable_Properties'Class не наследуется дочерними типами и подпрограммами, но улучшенные постословия класса наследуются обычным образом.
Конкретные и свойства класса типа вместе образуют стабильные свойства типа.
Для примитивной подпрограммы следующие определяемые языком аспекты могут быть указаны с помощью указания аспекта (см. 13.1.1):
Stable_Properties
Этот аспект должен быть указан с помощью определения аспекта свойства подпрограммы; каждое имя должно статически обозначать одну функцию свойства типа, для которого связанная подпрограмма является примитивной.
Stable_Properties'Class
Этот аспект должен быть указан с помощью определения аспекта свойства подпрограммы; каждое имя должно статически обозначать одну функцию свойства помеченного типа, для которого связанная подпрограмма является примитивной. В отличие от большинства аспектов класса, Stable_Properties'Class не наследуется дочерними подпрограммами, но улучшенные постословия класса наследуются обычным образом.
Правила легальности
Функция стабильного свойства типа T должна иметь не ограниченный тип возврата и должна быть:
- примитивной функцией с одним параметром в режиме in типа T; или
- функцией, объявленной непосредственно в области объявления, в которой объявлен тип предка T, и имеющей один параметр в режиме in типа класса, охватывающего T.
В определении аспекта свойства подпрограммы для подпрограммы S:
- все или ни одного из элементов должны предшествовать not;
- любые функции свойств, упомянутые после not, должны быть функцией стабильного свойства типа, для которого S является примитивной.
Если объявление переименования подпрограммы объявляет примитивную подпрограмму типа T, то переименованный вызываемый элемент также должен быть примитивной подпрограммой типа T, и две примитивные подпрограммы должны иметь одинаковые конкретные функции стабильного свойства и одинаковые функции стабильного свойства класса (см. ниже).
Статическая семантика
Для примитивной подпрограммы S типа T, конкретные функции стабильного свойства S для типа T:
- если S имеет указанный аспект Stable_Properties, который не включает not, те функции, обозначенные в аспекте Stable_Properties для S, имеющие параметр T или T'Class;
- если S имеет указанный аспект Stable_Properties, который включает not, те функции, обозначенные в аспекте Stable_Properties для T, за исключением тех, которые обозначены в аспекте Stable_Properties для S;
- если S не имеет аспекта Stable_Properties, те функции, обозначенные в аспекте Stable_Properties для T, если таковые имеются.
Аналогичное определение применяется к функциям стабильного свойства класса, заменив аспект Stable_Properties на аспект Stable_Properties'Class в вышеприведённом определении.
Явное выражение конкретного постословия для подпрограммы S — это выражение, непосредственно указанное для S с аспектом Post. Аналогично, явное выражение постословия класса для подпрограммы S — это выражение, непосредственно указанное для S с аспектом Post'Class.
Для примитивной подпрограммы S типа T, которая имеет параметр P типа T, параметр исключён из проверок стабильных свойств, если:
- S является функцией стабильного свойства T;
- P имеет режим out;
- аспект Global для S равен null, и P имеет режим in и режим не переопределён глобальным аспектом.
Для каждой примитивной подпрограммы S типа T, которая не является абстрактной подпрограммой или пустой процедурой, выражение конкретного постословия S модифицируется для включения выражений вида F(P) = F(P)'Old, все объединённые and с любым явным конкретным выражением постословия, с одним таким равенством, включённым для каждой конкретной функции стабильного свойства F для S для типа T, которая не встречается в явном конкретном выражении постословия S, и P — каждый параметр S, который имеет тип T и не исключён из проверок стабильных свойств. Результирующее выражение конкретного постословия S используется вместо явного выражения конкретного постословия S при интерпретации смысла постословия, как определено в 6.1.1.
Для каждой примитивной подпрограммы S типа T, выражение постословия класса S модифицируется для включения выражений вида F(P) = F(P)'Old, все объединённые and с любым явным выражением постословия класса, с одним таким равенством, включённым для каждой функции стабильного свойства класса F для S для типа T, которое не встречается в любом выражении постословия класса, которое применяется к S, и P — каждый параметр S, который имеет тип T и не исключён из проверок стабильных свойств. Результирующее выражение постословия класса S используется вместо явного выражения постословия класса S при интерпретации смысла постословия, как определено в 6.1.1.
Операция равенства, используемая в упомянутых выражениях равенства, описана в случае отдельной проверки принадлежности, чьё выбор принадлежности является выбором_простого_выражения (см. 4.5.2).
Добавления к выражению Post, описанные выше, включены или выключены в зависимости от политики утверждения Post, действующей в момент объявления подпрограммы S. Аналогичное правило применяется к добавлениям выражения Post'Class.
ПРИМЕЧАНИЕ Пример использования этих аспектов см. в определении контейнера Vector в A.18.2.