OberonCore
https://forum.oberoncore.ru/

Record assignment "projection"
https://forum.oberoncore.ru/viewtopic.php?f=29&t=1319
Страница 1 из 1

Автор:  Александр Ильин [ Пятница, 23 Январь, 2009 11:05 ]
Заголовок сообщения:  Record assignment "projection"

Начну с цитаты.
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" из КП?

Автор:  Valery Solovey [ Пятница, 23 Январь, 2009 12:01 ]
Заголовок сообщения:  Re: Record assignment "projection"

Александр Ильин писал(а):
Другими словами, в обоих вариантах объявления типов должны быть легальны оба присваивания:
Код:
v := e; e := v;

...
XDS допускает только первый вариант присваивания, а на второй ругается "incompatible types".
http://www.uni-vologda.ac.ru/oberon/o2rus.htm#Совместимость по присваиванию писал(а):
Выражение e типа Te совместимо по присваиванию с переменной v типа Tv, если выполнено одно из следующих условий:
...
3. Te и Tv - типы запись, Te есть расширение Tv, а v имеет динамический тип Tv;

Автор:  Александр Ильин [ Пятница, 23 Январь, 2009 13:14 ]
Заголовок сообщения:  Re: Record assignment "projection"

Спасибо! Действительно, в приложении к Oberon-2 Report указано такое требование для assignment compatibility. Значит, XDS правильно делает.

Автор:  Info21 [ Пятница, 23 Январь, 2009 15:08 ]
Заголовок сообщения:  Re: Record assignment "projection"

Александр Ильин писал(а):
почему убрали "projection" из КП?

Слишком скользкое место.

Автор:  Wlad [ Пятница, 23 Январь, 2009 15:21 ]
Заголовок сообщения:  Re: Record assignment "projection"

Info21 писал(а):
Александр Ильин писал(а):
почему убрали "projection" из КП?

Слишком скользкое место.

Да, по-моему, ваще фигня какая-то...
Если структуры не участвуют в обобщённых алгоритмах (оперирующих через ссылки на базовый тип), то там вообще смысла нет говорить о присваивании типа-предка расширенному типу, если только они не одного динамического типа и если нет оговоренных правил для инициализации значениями полей по умолчанию...
Ну, или, следуя парадигме оберонов ("всё - явно!") мы сами должны после такого присваивания ЯВНО прописать такое присваивание оставшимся полям экземпляра расширенного типа...

Автор:  ilovb [ Вторник, 12 Ноябрь, 2013 21:31 ]
Заголовок сообщения:  Re: Record assignment "projection"

Люди, подскажите почему нельзя присваивать EXTENSIBLE RECORD?
Код:
MODULE DsTest;
   IMPORT Log;

   PROCEDURE Do*;
      TYPE
         T = EXTENSIBLE RECORD
            a, b: INTEGER;
         END;
      VAR
         d1, d2: T;
   BEGIN
      d2.a := 1;
      d2.b := 2;
      d1 := d2; (* incompatible assignment *)
   END Do;

BEGIN

END DsTest.Do

Где об этом сказано в репорте?

ADD: Сам нашел:
Цитата:
1. Te and Tv are equal and neither abstract, extensible, or limited record nor open array types;

Автор:  Илья Ермаков [ Среда, 13 Ноябрь, 2013 05:12 ]
Заголовок сообщения:  Re: Record assignment "projection"

В принципе, библиотечная Copy (IN a: ANYREC; VAR b: ANYREC) пишется легко...
Можно иметь два варианта: для случая b extends a и для случая, когда a и b имеют общий базовый тип - и копируются только его поля..

Страница 1 из 1 Часовой пояс: UTC + 3 часа
Powered by phpBB® Forum Software © phpBB Group
https://www.phpbb.com/