OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Суббота, 17 Август, 2019 18:37

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 7 ] 
Автор Сообщение
 Заголовок сообщения: Record assignment "projection"
СообщениеДобавлено: Пятница, 23 Январь, 2009 11:05 
Аватара пользователя

Зарегистрирован: Вторник, 19 Сентябрь, 2006 21:54
Сообщения: 2309
Откуда: Россия, Томск
Начну с цитаты.
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" из КП?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Record assignment "projection"
СообщениеДобавлено: Пятница, 23 Январь, 2009 12:01 

Зарегистрирован: Понедельник, 30 Июль, 2007 10:53
Сообщения: 1538
Откуда: Беларусь, Минск
Александр Ильин писал(а):
Другими словами, в обоих вариантах объявления типов должны быть легальны оба присваивания:
Код:
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;


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Record assignment "projection"
СообщениеДобавлено: Пятница, 23 Январь, 2009 13:14 
Аватара пользователя

Зарегистрирован: Вторник, 19 Сентябрь, 2006 21:54
Сообщения: 2309
Откуда: Россия, Томск
Спасибо! Действительно, в приложении к Oberon-2 Report указано такое требование для assignment compatibility. Значит, XDS правильно делает.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Record assignment "projection"
СообщениеДобавлено: Пятница, 23 Январь, 2009 15:08 
Аватара пользователя

Зарегистрирован: Пятница, 25 Ноябрь, 2005 12:02
Сообщения: 8169
Откуда: Троицк, Москва
Александр Ильин писал(а):
почему убрали "projection" из КП?

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Record assignment "projection"
СообщениеДобавлено: Пятница, 23 Январь, 2009 15:21 

Зарегистрирован: Воскресенье, 28 Май, 2006 22:12
Сообщения: 1381
Info21 писал(а):
Александр Ильин писал(а):
почему убрали "projection" из КП?

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

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Record assignment "projection"
СообщениеДобавлено: Вторник, 12 Ноябрь, 2013 21:31 

Зарегистрирован: Вторник, 30 Июнь, 2009 14:58
Сообщения: 1549
Люди, подскажите почему нельзя присваивать 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;


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Record assignment "projection"
СообщениеДобавлено: Среда, 13 Ноябрь, 2013 05:12 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9129
Откуда: Россия, Орёл
В принципе, библиотечная Copy (IN a: ANYREC; VAR b: ANYREC) пишется легко...
Можно иметь два варианта: для случая b extends a и для случая, когда a и b имеют общий базовый тип - и копируются только его поля..


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 7 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: Google [Bot] и гости: 0


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Вся информация, размещаемая участниками на конференции (тексты сообщений, вложения и пр.) © 2005-2019, участники конференции «OberonCore», если специально не оговорено иное.
Администрация не несет ответственности за мнения, стиль и достоверность высказываний участников, равно как и за безопасность материалов, предоставляемых участниками во вложениях.
Без разрешения участников и ссылки на конференцию «OberonCore» любое воспроизведение и/или копирование высказываний полностью и/или по частям запрещено.
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB