Начну с цитаты.
N.Wirth in Oberon-2 Report - 9.1 Assignments писал(а):
If an expression e of type Te is assigned to a variable v of type Tv, the following happens:
1. if Tv and Te are record types, only those fields of Te are assigned which also belong to Tv (projection); the dynamic type of v must be the same as the static type of v and is not changed by the assignment;
Другими словами, если у нас есть следующий код:
Код:
TYPE
Tv = RECORD x: INTEGER END;
Te = RECORD (Tv) y: INTEGER END;
VAR
v: Tv;
e: Te;
BEGIN
v := e;
, то в результате должно быть
v.x =
e.x, а значение
e.y в присваивании не участвует и должно быть проигнорировано благодаря
projection. Здесь у нас тип
Te был шире, чем
Tv, то есть присваивали большее меньшему и лишнее игнорировали. Рассмотрим теперь обратную ситуацию:
Код:
TYPE
Te = RECORD x: INTEGER END;
Tv = RECORD (Te) y: INTEGER END;
VAR
v: Tv;
e: Te;
BEGIN
v := e;
Теперь расширенному типу присваивается базовый (большему меньший). В результате, как и в первом случае, должно быть
v.x =
e.x, а благодаря
projection значение
v.y должно остаться неизменным.
Другими словами, в обоих вариантах объявления типов должны быть легальны оба присваивания:
Код:
v := e; e := v;
Правильно ли я понимаю механизм проекции в присваивании?
Что имеем на практике?
XDS допускает только первый вариант присваивания, а на второй ругается "incompatible types".
BlackBox 1.5 и 1.6 запрещают ОБА ПРИСВАИВАНИЯ!
Код:
MODULE PrivTestProjection;
PROCEDURE Do* ();
TYPE
Base = EXTENSIBLE RECORD x: INTEGER END;
Ext = RECORD (Base) y: INTEGER END;
VAR
base: Base;
ext : Ext;
BEGIN
base := ext; (* incompatible assignment *)
ext := base; (* incompatible assignment *)
END Do;
END PrivTestProjection.
В сообщении о Компонентном Паскале вообще удалено упоминание о проекции, там просто написано:
Component Pascal Language Report - 9.1 Assignments писал(а):
1. if Tv and Te are record types, all fields of that type are assigned.
, без объяснения, динамические или статические типы имеются в виду, а в Приложении А написано, что для совместимости по присваиванию типы должны совпадать.
Кто может объяснить, почему убрали "projection" из КП?