OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Воскресенье, 21 Июль, 2019 19:54

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




Начать новую тему Ответить на тему  [ Сообщений: 30 ]  На страницу 1, 2  След.
Автор Сообщение
 Заголовок сообщения: Совместимость записей в Oberon-07
СообщениеДобавлено: Среда, 20 Октябрь, 2010 09:27 

Зарегистрирован: Пятница, 13 Март, 2009 16:36
Сообщения: 798
Откуда: Казань
Хотелось бы уточнить пару деталей по грамматике языка:
Код:
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?


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

Зарегистрирован: Вторник, 19 Сентябрь, 2006 21:54
Сообщения: 2308
Откуда: Россия, Санкт-Петербург
Rifat писал(а):
Правильно ли понимаю относительно пунктов 1, 2, 3?
Насколько я понимаю, язык Oberon-07 в этой части не отличается от Oberon-2.
1 - да;
2 - должно компилироваться ("projection");
3 - не должно компилироваться, т.к. не все поля p1^ заполняются в результате присваивания.

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Совместимость записей в Oberon-07
СообщениеДобавлено: Пятница, 22 Октябрь, 2010 09:45 

Зарегистрирован: Пятница, 13 Март, 2009 16:36
Сообщения: 798
Откуда: Казань
В описании языка 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.


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

Зарегистрирован: Вторник, 19 Сентябрь, 2006 21:54
Сообщения: 2308
Откуда: Россия, Санкт-Петербург
Похоже, что вы правы. На всякий случай спросил у Криса Барроуза, автора Astrobe. Уж он-то точно должен был в этом подробно разобраться при написании компилятора. Жду ответа.


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

Зарегистрирован: Пятница, 25 Ноябрь, 2005 12:02
Сообщения: 8169
Откуда: Троицк, Москва
Любопытный пунктик.
В том, что сделал Вирт, есть единообразие (что есть часть общего Понятия Простоты, к которой он в Оберонах всегда стремится).

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

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Совместимость записей в Oberon-07
СообщениеДобавлено: Пятница, 22 Октябрь, 2010 11:28 

Зарегистрирован: Пятница, 13 Март, 2009 16:36
Сообщения: 798
Откуда: Казань
Пока что мне кажется немного странным, что
расширенной записи можно присвоить запись базового типа,
а в случае указателей наоборот
указателю базового типа можно присвоить указатель на расширенный тип.


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

Зарегистрирован: Пятница, 25 Ноябрь, 2005 18:55
Сообщения: 2272
Откуда: Россия, Нижний Новгород
Я бы запретил и (2) и (3) по причине излишней мудрёности.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Совместимость записей в Oberon-07
СообщениеДобавлено: Пятница, 22 Октябрь, 2010 11:39 
Модератор
Аватара пользователя

Зарегистрирован: Среда, 16 Ноябрь, 2005 00:53
Сообщения: 4489
Откуда: Россия, Орёл
Rifat писал(а):
Пока что мне кажется немного странным, что
расширенной записи можно присвоить запись базового типа,
а в случае указателей наоборот
указателю базового типа можно присвоить указатель на расширенный тип.
1) В случае присвоения записей, копируются поля, которых у расширенной >= базовой. Т.е. всегда можно скопировать все поля базовой в расширенную, но не наоборот. В язык встроено средство для эффективного копирования полей.

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

Как-то так.


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

Зарегистрирован: Вторник, 19 Сентябрь, 2006 21:54
Сообщения: 2308
Откуда: Россия, Санкт-Петербург
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;


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

Зарегистрирован: Вторник, 19 Сентябрь, 2006 21:54
Сообщения: 2308
Откуда: Россия, Санкт-Петербург
Напомню документ по Оберону-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). Более того, они оба могут быть независимыми расширениями некоторой базовой записи, в этом случае копироваться должны только базовые (общие для обоих типов) поля.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Совместимость записей в Oberon-07
СообщениеДобавлено: Пятница, 22 Октябрь, 2010 12:42 

Зарегистрирован: Понедельник, 30 Июль, 2007 10:53
Сообщения: 1538
Откуда: Беларусь, Минск
А вариант описки в документации на O07 не рассматривался?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Совместимость записей в Oberon-07
СообщениеДобавлено: Пятница, 22 Октябрь, 2010 13:14 

Зарегистрирован: Понедельник, 30 Июль, 2007 10:53
Сообщения: 1538
Откуда: Беларусь, Минск
Александр Ильин писал(а):
А в Обероне имеется следующая строка:
Цитата:
The type of the expression must be included by the type of the variable, or it must extend the type of the variable.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Совместимость записей в Oberon-07
СообщениеДобавлено: Пятница, 22 Октябрь, 2010 15:41 

Зарегистрирован: Пятница, 13 Март, 2009 16:36
Сообщения: 798
Откуда: Казань
Спасибо, за короткую и ясную цитату. Этот принцип все объясняет.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Совместимость записей в Oberon-07
СообщениеДобавлено: Пятница, 22 Октябрь, 2010 18:04 

Зарегистрирован: Понедельник, 28 Ноябрь, 2005 10:28
Сообщения: 1198
Сергей Губанов писал(а):
Я бы запретил и (2) и (3) по причине излишней мудрёности.

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


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

Зарегистрирован: Суббота, 07 Март, 2009 15:39
Сообщения: 3060
Откуда: Астрахань
Rifat писал(а):
Пока что мне кажется немного странным, что
расширенной записи можно присвоить запись базового типа,
а в случае указателей наоборот
указателю базового типа можно присвоить указатель на расширенный тип.

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Совместимость записей в Oberon-07
СообщениеДобавлено: Воскресенье, 24 Октябрь, 2010 15:14 

Зарегистрирован: Вторник, 22 Май, 2007 15:38
Сообщения: 145
Откуда: Питер
Помнится во время знакомства с обероном (XDS) при конструировании одного
модудя я думал как лучше оформить некие данные - в виде записей или в виде
указателей на записи. Были задействованы базовые записи и их расширения.
Игрался, смотрел как удобнее потом будет использовать.

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Совместимость записей в Oberon-07
СообщениеДобавлено: Воскресенье, 24 Октябрь, 2010 15:27 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9127
Откуда: Россия, Орёл
Да, лучше разрешать присваивание только для идентичных типов.

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

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


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

Зарегистрирован: Пятница, 25 Ноябрь, 2005 18:55
Сообщения: 2272
Откуда: Россия, Нижний Новгород
Trurl писал(а):
Сергей Губанов писал(а):
Я бы запретил и (2) и (3) по причине излишней мудрёности.
А как тогда со строками работать?
При чём тут строки? Строки - ARRAY, а тут RECORD.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Совместимость записей в Oberon-07
СообщениеДобавлено: Среда, 17 Ноябрь, 2010 00:56 
Аватара пользователя

Зарегистрирован: Вторник, 19 Сентябрь, 2006 21:54
Сообщения: 2308
Откуда: Россия, Санкт-Петербург
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.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Совместимость записей в Oberon-07
СообщениеДобавлено: Среда, 17 Ноябрь, 2010 01:04 
Аватара пользователя

Зарегистрирован: Пятница, 25 Ноябрь, 2005 12:02
Сообщения: 8169
Откуда: Троицк, Москва
Илья Ермаков писал(а):
Я применяю и CopyRec(IN a: ANYREC; VAR b: ANYREC), и ...
Пороть Вас некому, Илья Евгеньевич.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 30 ]  На страницу 1, 2  След.

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


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

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1


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

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