FUNCTION TYPEOF ( V : GENERIC) : SET OF STRING;
Функция TYPEOF возвращает набор строк, содержащих имена всех типов данных, к которым принадлежит данный параметр. За исключением простых типов данных (BINARY, BOOLEAN, INTEGER, LOGICAL, NUMBER, REAL и STRING) и агрегированных типов данных (ARRAY, BAG, LIST, SET), данные имена уточняются именем схемы, содержащей определение данного типа данных.
Примечание - Основным назначением данной функции является проверка, может ли данное значение (переменной или атрибута) использоваться для определенной цели, например, чтобы убедиться в совместимости по присваиванию двух значений. Данная функция может также использоваться, если разные подтипы или конкретизации заданного типа данных должны по-разному трактоваться в некотором контексте.
Параметр: V - значение любого типа данных.
Результат: содержимым возвращаемого набора строковых значений являются имена (на верхнем регистре) всех типов данных, к которым принадлежит V. Данные имена уточняются именем схемы, содержащей определение данного типа данных ( 'SCHEMA.TYPE' ), если они не относятся к простому или агрегированному типу данных. Возвращаемый набор строковых значений может быть определен посредством следующего алгоритма (данный алгоритм приводится здесь в целях пояснения, а не в качестве предписания какого-либо конкретного вида реализации):
a) возвращаемый набор строковых значений набор инициализируется включением как имени типа данных, к которому принадлежит V, так и именем типа данных, которое представляет экземпляр V (если они различаются), включая имена их схем, если данные типы данных являются именованными типами данных; при этом применяются следующие правила:
Примечание - Если фактический параметр, передаваемый функции TYPEOF, был формальным параметром некоторой вычисляемой функции, то "типом данных, к которому принадлежит V (в соответствии с объявлением)" является тип данных, объявленный для исходного фактического параметра, или тип данных результата вычисления выражения, определяющего фактический параметр, в соответствии с разделом 12, а не тип данных, объявленный для формального параметра, вместо которого он подставлен,
1) если V является агрегированным значением, то имя типа данных является просто именем агрегированного типа данных (ARRAY, BAG, LIST, SET), а не каким-либо другим,
2) если V является перечисляемым типом данных, базирующимся на другом перечисляемом типе данных, то добавляют имена перечисляемых типов данных, получаемых при прослеживании взаимосвязей BASED_ON, начиная от данного перечисляемого типа данных,
3) если V является наращиваемым перечисляемым типом данных, то рекурсивно добавляются имена перечисляемых типов данных, являющихся расширениями V.
Примечание - Две последние из перечисленных выше позиций справедливы для расширяемого перечисляемого типа данных, который базируется на другом перечисляемом типе данных,
4) если V имеет неопределенное (?) значение, то возвращается пустой набор типа данных SET;
b) повторяют следующие действия до тех пор, пока возвращаемый набор не перестанет расширяться:
1) выполняют следующие действия для всех имен в возвращаемом наборе:
- если текущее имя является именем простого типа данных, то пропускают,
- если текущее имя является именем агрегированного типа данных (ARRAY, BAG, LIST, SET), то пропускают,
- если текущее имя является именем перечисляемого типа данных, то пропускают,
- если текущее имя является именем выбираемого типа данных, то к возвращаемому набору добавляются имена всех типов данных (с именем схемы) из списка выбора, которые действительно конкретизируются посредством V (данных имен может быть несколько, так как список выбора может содержать имена типов данных, являющихся совместимыми подтипами общего супертипа или конкретизациями одного общего обобщенного типа),
- если текущее имя является именем любого другого вида определенного типа данных, то имя типа данных, на который ссылается определение данного типа данных, включая (при необходимости)имя схемы, добавляется к возвращаемому набору. Если ссылка делается на агрегированный тип данных, то добавляется имя данного агрегированного типа данных,
- если текущее имя является именем объекта, то к возвращаемому набору добавляются имена всех тех подтипов (включая, при необходимости, имя схемы), которые действительно конкретизируются посредством V,
2) выполняют следующие действия для всех имен в возвращаемом наборе:
- если текущее имя является именем подтипа, то к возвращаемому набору добавляются имена всех его супертипов,
- если текущее имя является именем конкретизации, то к возвращаемому набору добавляются имена всех ее обобщений,
3) выполняют следующие действия для всех имен в возвращаемом наборе и для каждого типа данных SELECT, у которого текущее имя присутствует в списке выбора:
- добавляют имя выбираемого типа данных к списку,
- если выбираемый тип данных базируется на другом выбираемом типе данных, то добавляют имена выбираемых типов данных, получаемых при прослеживании взаимосвязей BASED_ON, начиная с текущего выбираемого типа данных,
- если выбираемый тип данных является наращиваемым выбираемым типом данных, то рекурсивно добавляют имена выбираемых типов данных, являющихся расширениями текущего выбираемого типа данных,
4) выполняют следующие действия для всех имен в возвращаемом наборе: если текущее имя импортировано в схему посредством операторов USE или REFERENCE, то в возвращаемый набор добавляют имя из схемы, откуда был осуществлен импорт, уточненное именем данной схемы. Поскольку операторы USE могут быть связаны в цепочки, в возвращаемый набор также добавляют имена из всех связанных схем, уточненные именами соответствующих схем;