Trurl писал(а):
Вы ведь хотите прояснить, а получается наоборот.
Второй столбик описывает аргументы, а четвертый - результат. Остается неясным, какой будет результат функции, если T - не record type.
Пожалуй, вы меня убедили: раз есть разделение информации по столбикам, надо во 2м указать исчерпывающе и однозначно.
Trurl писал(а):
Далее, чем "type name" отличается от аналогичных параметров MIN, MAX, SIZE, ADR, где используется просто "type"?
Строго говоря, если использовать просто type, то должно работать SYSTEM.TYP(POINTER TO RECORD END). Поэтому я и предложил type name. Но PSI не отличается вообще такой строгостью; пожалуй, можно как в MIN написать: T = [pointer to] record type
Trurl писал(а):
Наконец, неплохо бы прояснить, что такое "type tag" и чем оно отличается от "address of Descriptor of T", возвращаемого ADR.
Отличное замечание! Действительно, Type tag = address of Descriptor of T. Но в PSI это явно не оговаривается, и в описаниях процедур используются эти два отличных термина. Возможно, стоит либо, всамделе, явно прояснить, либо избавиться от одного - наверное, от тэга.
Кроме того, получается, что есть двойственность: SYSTEM.ADR(T) = SYSTEM.TYP(T). Кажется, есть что выкинуть из компилятора. Я не обращал внимания, что есть такая форма ADR.
Trurl писал(а):
И еще. Может, это вовсе не преднамеренное поведение? И надо не описывать, а править компилятор.
Зачем такое дублирование процедур - непонятно. Но вариант SYSTEM.TYP(T) используется в Kernel наряду с SYSTEM.ADR(T) и SYSTEM.TYP(rec).
Так что, может, стоит поправить и компилятор, и PSI.
Кроме того, в PSI написано, что SYSTEM.ADR принимает аргумент T: a record type, однако фактически он принимает и A: an array type, и P: a procedural type. То есть SYSTEM.ADR возвращает адрес дескриптора для всех дескриптируемых типов: структурных, указательных и процедурных.
При этом SYSTEM.TYP принимает только записные и указатели на записные, и не дифференцирует их:
TYPE Rec = RECORD END; PRec = POINTER TO Rec;
SYSTEM.TYP(Rec) = SYSTEM.TYP(PRec)
Получается, единственный случай, когда результаты SYSTEM.TYP и .ADR отличаются - это если T - указатель на безымянный тип:
TYPE T = POINTER TO RECORD END;
SYSTEM.ADR(T) # SYSTEM.TYP(T)
Но это имеет, как кажется, такую ничтожную практическую значимость, что SYSTEM.TYP на мой взгляд - кандидат на исключение вообще.