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 , то в результате должно быть v.x = e.x, а значение e.y в присваивании не участвует и должно быть проигнорировано благодаря projection. Здесь у нас тип Te был шире, чем Tv, то есть присваивали большее меньшему и лишнее игнорировали. Рассмотрим теперь обратную ситуацию:Tv = RECORD x: INTEGER END; Te = RECORD (Tv) y: INTEGER END; VAR v: Tv; e: Te; BEGIN v := e; Код: TYPE Теперь расширенному типу присваивается базовый (большему меньший). В результате, как и в первом случае, должно быть v.x = e.x, а благодаря projection значение v.y должно остаться неизменным.Te = RECORD x: INTEGER END; Tv = RECORD (Te) y: INTEGER END; VAR v: Tv; e: Te; BEGIN v := e; Другими словами, в обоих вариантах объявления типов должны быть легальны оба присваивания: Код: 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/ |