OberonCore
https://forum.oberoncore.ru/

Совместимость записей в Oberon-07
https://forum.oberoncore.ru/viewtopic.php?f=115&t=2920
Страница 1 из 2

Автор:  Rifat [ Среда, 20 Октябрь, 2010 09:27 ]
Заголовок сообщения:  Совместимость записей в Oberon-07

Хотелось бы уточнить пару деталей по грамматике языка:
Код:
MODULE MyMod;

  TYPE
    R0 = RECORD a: INTEGER END;
    R1 = RECORD (R0) b: INTEGER END;
    P0 = POINTER TO R0;
    P1 = POINTER TO R1;

  VAR
    p0: P0;
    p1: P1;

BEGIN
  NEW(p0);
  NEW(p1);
  p0 := p1; (* 1. Насколько понимаю, так можно делать *)
  p0^ := p1^; (* 2. Это не должно компилироваться, хотя для Oberon-2 такое возможно *)
  p1^ := p0^; (* 3. Это должно компилироваться, согласно пункту 9.1 п 4 *)
END MyMod.

Правильно ли понимаю относительно пунктов 1, 2, 3?

Автор:  Александр Ильин [ Пятница, 22 Октябрь, 2010 06:33 ]
Заголовок сообщения:  Re: Совместимость записей в Oberon-07

Rifat писал(а):
Правильно ли понимаю относительно пунктов 1, 2, 3?
Насколько я понимаю, язык Oberon-07 в этой части не отличается от Oberon-2.
1 - да;
2 - должно компилироваться ("projection");
3 - не должно компилироваться, т.к. не все поля p1^ заполняются в результате присваивания.

Проверено в Astrobe v3.2.

Автор:  Rifat [ Пятница, 22 Октябрь, 2010 09:45 ]
Заголовок сообщения:  Re: Совместимость записей в Oberon-07

В описании языка Oberon-07 написано следующее:
9.1. Assignments
The assignment serves to replace the current value of a variable by a new value specified by an
expression. The assignment operator is written as ":=" and pronounced as becomes.
assignment = designator ":=" expression.
The type of the expression must be the same as that of the designator. The following exceptions
hold:
1. The constant NIL can be assigned to variables of any pointer or procedure type.
2. Arrays must have the same element type, and the length of the destination array must not be
less than the length of the source array.
3. Strings can be assigned to any array of characters, provided the string is not longer than the
array.
4. In the case of records, the type of the destination must be an extension of the type of the
source.
Насколько я понимаю, в пункте 4 говорится о том, что переменная в левой части присваивания должна быть расширением переменной, которая находится в правой части присваивания. Да при этом не все поля будут заполняться. Это присваивание возникло взамен стандартной процедуры COPY.

Цитата:
Насколько я понимаю, язык Oberon-07 в этой части не отличается от Oberon-2.

По крайней мере из описания языка следует, что Oberon-07 отличается от Oberon-2.
Про projection написано в описании языка Oberon-2, но не написано в Oberon-07.
С массивами тоже расхождение, например:
Код:
MODULE Mod;

  TYPE T = RECORD a, b: INTEGER END;

  VAR m1: ARRAY 5 OF T;
    m2: ARRAY 10 OF T;

BEGIN
  m2 := m1; (* В оберон-07 должно компилироваться, а в оберон-2 нет *)
END Mod.

Автор:  Александр Ильин [ Пятница, 22 Октябрь, 2010 11:00 ]
Заголовок сообщения:  Re: Совместимость записей в Oberon-07

Похоже, что вы правы. На всякий случай спросил у Криса Барроуза, автора Astrobe. Уж он-то точно должен был в этом подробно разобраться при написании компилятора. Жду ответа.

Автор:  Info21 [ Пятница, 22 Октябрь, 2010 11:17 ]
Заголовок сообщения:  Re: Совместимость записей в Oberon-07

Любопытный пунктик.
В том, что сделал Вирт, есть единообразие (что есть часть общего Понятия Простоты, к которой он в Оберонах всегда стремится).

Но нет полной уверенности, что в случае записей это правильно.
Тут нужен опыт. В моей памяти нет ничего, что бы как-то тут резонировало.

Было бы любопытно о впечатлениях других людей узнать в этом вопросе.

Автор:  Rifat [ Пятница, 22 Октябрь, 2010 11:28 ]
Заголовок сообщения:  Re: Совместимость записей в Oberon-07

Пока что мне кажется немного странным, что
расширенной записи можно присвоить запись базового типа,
а в случае указателей наоборот
указателю базового типа можно присвоить указатель на расширенный тип.

Автор:  Сергей Губанов [ Пятница, 22 Октябрь, 2010 11:32 ]
Заголовок сообщения:  Re: Совместимость записей в Oberon-07

Я бы запретил и (2) и (3) по причине излишней мудрёности.

Автор:  Евгений Темиргалеев [ Пятница, 22 Октябрь, 2010 11:39 ]
Заголовок сообщения:  Re: Совместимость записей в Oberon-07

Rifat писал(а):
Пока что мне кажется немного странным, что
расширенной записи можно присвоить запись базового типа,
а в случае указателей наоборот
указателю базового типа можно присвоить указатель на расширенный тип.
1) В случае присвоения записей, копируются поля, которых у расширенной >= базовой. Т.е. всегда можно скопировать все поля базовой в расширенную, но не наоборот. В язык встроено средство для эффективного копирования полей.

2) При присвоении указателей учитывается герметичность типов (не уверен, что правильно применил термин). Множесто базовых записей содержит все подмножества расширенных. Т.е. указатель на базовую запись может указывать на любую расширенную, но не наоборот.

Как-то так.

Автор:  Александр Ильин [ Пятница, 22 Октябрь, 2010 11:43 ]
Заголовок сообщения:  Re: Совместимость записей в Oberon-07

Info21 писал(а):
Было бы любопытно о впечатлениях других людей узнать в этом вопросе.
Наверное, в компиляторе получилось единообразнее: короткий массив копируется в длинный массив, короткая запись - в длинную запись.

Мне, кстати, такая возможность однажды понадобилась в Oberon-2, если я правильно помню, пришлось прибегнуть к SYSTEM.MOVE. Впрочем, я там изголялся ввиду отсутствия в Обероне-2 абстрактных записей Компонентного Паскаля. Если бы были абстрактные записи, то не понадобилось бы.

Во, нашёл:
Код:
TYPE
   StrHeadDesc = RECORD(StrDesc)...
...
PROCEDURE CopyStrDesc (VAR src, dst: StrDesc);
(* Copy 'src' record contents into 'dst', even if their actual types are
 * extended. It is impossible to assign "StrHeadDesc := StrDesc" in XDS
 * despite the Oberon language "projection" requirement for record assignment,
 * thus this hack. *)
BEGIN
   SYSTEM.MOVE (SYSTEM.ADR (src), SYSTEM.ADR (dst), SIZE (StrDesc));
END CopyStrDesc;

Автор:  Александр Ильин [ Пятница, 22 Октябрь, 2010 11:53 ]
Заголовок сообщения:  Re: Совместимость записей в Oberon-07

Напомню документ по Оберону-2:
Цитата:
If an expression e of type Te is assigned to a variable v of type Tv, the following happens:

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;
Мне в этом читается, что присваиваемое значение (типа Te) может быть как расширенным типом, так и предком переменной (типа Tv). Более того, они оба могут быть независимыми расширениями некоторой базовой записи, в этом случае копироваться должны только базовые (общие для обоих типов) поля.

Автор:  Valery Solovey [ Пятница, 22 Октябрь, 2010 12:42 ]
Заголовок сообщения:  Re: Совместимость записей в Oberon-07

А вариант описки в документации на O07 не рассматривался?

Автор:  Valery Solovey [ Пятница, 22 Октябрь, 2010 13:14 ]
Заголовок сообщения:  Re: Совместимость записей в Oberon-07

Александр Ильин писал(а):
А в Обероне имеется следующая строка:
Цитата:
The type of the expression must be included by the type of the variable, or it must extend the type of the variable.

Автор:  Rifat [ Пятница, 22 Октябрь, 2010 15:41 ]
Заголовок сообщения:  Re: Совместимость записей в Oberon-07

Спасибо, за короткую и ясную цитату. Этот принцип все объясняет.

Автор:  Trurl [ Пятница, 22 Октябрь, 2010 18:04 ]
Заголовок сообщения:  Re: Совместимость записей в Oberon-07

Сергей Губанов писал(а):
Я бы запретил и (2) и (3) по причине излишней мудрёности.

А как тогда со строками работать?

Автор:  Валерий Лаптев [ Суббота, 23 Октябрь, 2010 18:43 ]
Заголовок сообщения:  Re: Совместимость записей в Oberon-07

Rifat писал(а):
Пока что мне кажется немного странным, что
расширенной записи можно присвоить запись базового типа,
а в случае указателей наоборот
указателю базового типа можно присвоить указатель на расширенный тип.

Вообще-то что сделано в С++.
1. Принцип подстановки гласит: на место объекта базового типа типа может быть подставлен объект производного типа.
То есть на примере: параметр функции - часы. На его место в качестве аргумента при вызове может быть поставлен объект производного класса - будильник. Будильник - это часы, но не каждые часы - будильник.
При таком присвоении может быть срезка - о чем все учебники С++ предупреждают. Поэтому рекомендуется передавать параметры по ссылке, а не по значению. При ссылках срезок не бывает.
2. С указателями описанным способом работает виртуальность: указателю на базовый тип может быть присвоен указатель на производный тип. При вызове виртуального метода по указателю вызывается метод по типу присвоенного указателя, а не по объявленному. То есть если указателю на базовый тип присвоен указатель на производный тип, то вызывается виртуальный метод производного класса.

Автор:  GameHunter [ Воскресенье, 24 Октябрь, 2010 15:14 ]
Заголовок сообщения:  Re: Совместимость записей в Oberon-07

Помнится во время знакомства с обероном (XDS) при конструировании одного
модудя я думал как лучше оформить некие данные - в виде записей или в виде
указателей на записи. Были задействованы базовые записи и их расширения.
Игрался, смотрел как удобнее потом будет использовать.

Так вот, при изменении типов с указателей на записи присваивание запросто
компилировалось, создавалось впечатление, что никаких принципиальных отличий
нет. Потом эту ушибку было трудно найти.

Автор:  Илья Ермаков [ Воскресенье, 24 Октябрь, 2010 15:27 ]
Заголовок сообщения:  Re: Совместимость записей в Oberon-07

Да, лучше разрешать присваивание только для идентичных типов.

Копирование неидентичных записей всегда можно сделать в виде функции в библиотеке.

Я применяю и CopyRec(IN a: ANYREC; VAR b: ANYREC), и DynCopy(IN x: ANYREC): ANYPTR , и CopySamePart, которая для двух записей находит общий знаменатель (какого-то общего "предка") и копирует его.
Если интересно, можно будет рассмотреть устройство этих функций для КП/ББ в "Системных вопросах".

Автор:  Сергей Губанов [ Понедельник, 25 Октябрь, 2010 17:56 ]
Заголовок сообщения:  Re: Совместимость записей в Oberon-07

Trurl писал(а):
Сергей Губанов писал(а):
Я бы запретил и (2) и (3) по причине излишней мудрёности.
А как тогда со строками работать?
При чём тут строки? Строки - ARRAY, а тут RECORD.

Автор:  Александр Ильин [ Среда, 17 Ноябрь, 2010 00:56 ]
Заголовок сообщения:  Re: Совместимость записей в Oberon-07

Valery Solovey писал(а):
А вариант описки в документации на O07 не рассматривался?
Был рассмотрен такой вариант, Крис Барроуз считает, что описка. Я, прочитав сообщения о языках -2 и -07, с ним согласился. Пункт 9.1.4 следует читать так: "In the case of records, the type of the source must be an extension of the type of the destination." Ошибка обнаружена в документе "The Programming Language Oberon", в ревизии 1.12.2007.

Автор:  Info21 [ Среда, 17 Ноябрь, 2010 01:04 ]
Заголовок сообщения:  Re: Совместимость записей в Oberon-07

Илья Ермаков писал(а):
Я применяю и CopyRec(IN a: ANYREC; VAR b: ANYREC), и ...
Пороть Вас некому, Илья Евгеньевич.

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