OberonCore
https://forum.oberoncore.ru/

Собственные типы
https://forum.oberoncore.ru/viewtopic.php?f=35&t=6117
Страница 1 из 2

Автор:  Александр К [ Пятница, 29 Сентябрь, 2017 20:12 ]
Заголовок сообщения:  Собственные типы

Кто-нибудь напишите как пользоваться собтвенными типами, как их объявлять. Краткий ЛекБез.

Автор:  Александр К [ Суббота, 30 Сентябрь, 2017 15:41 ]
Заголовок сообщения:  Re: Собственные типы

Например, в чём разница между
Код:
TYPE a = RECORD
b: INTEGER;
c: BOOLEAN
END;
VAR d: a;

и
Код:
VAR d: RECORD
b: INTEGER;
c: BOOLEAN
END;
 

Автор:  Rifat [ Суббота, 30 Сентябрь, 2017 15:47 ]
Заголовок сообщения:  Re: Собственные типы

Александр К писал(а):
Например, в чём разница между
Код:
TYPE a = RECORD
b: INTEGER;
c: BOOLEAN
END;
VAR d: a;

и
Код:
VAR d: RECORD
b: INTEGER;
c: BOOLEAN
END;
 

Тип a, можно использовать для описания других переменных и для описания параметров. И все переменные этого типа будут совместимы с этим параметром функции.
А если допустим, использовать переменную d и пытаться подставлять её в параметр функции типа a, то компилятор будет ругаться, что типы не совпадают.

Автор:  Александр К [ Воскресенье, 01 Октябрь, 2017 07:44 ]
Заголовок сообщения:  Re: Собственные типы

Цитата:
Тип a, можно использовать для описания других переменных и для описания параметров. И все переменные этого типа будут совместимы с этим параметром функции.
А если допустим, использовать переменную d и пытаться подставлять её в параметр функции типа a, то компилятор будет ругаться, что типы не совпадают.

Это понятно, но чем VAR отличается от TYPE?
Например:
Код:
VAR d1, d2, d3: RECORD
b: INTEGER;
c: BOOLEAN
END;
...
d1:=d2;

Код:
TYPE a = RECORD
b: INTEGER;
c: BOOLEAN
END;
VAR d1, d2, d4: a;
...
d1:=d2;

В обоих примерах присваивание произойдёт.
Код:
d3:=d4;

Цитата:
компилятор будет ругаться, что типы не совпадают.

Я так понимаю, что это даёт слово RECORD.

Автор:  Александр К [ Воскресенье, 01 Октябрь, 2017 08:57 ]
Заголовок сообщения:  Re: Собственные типы

В старом Паскале были записи с вариантами (использовался оператор CASE):
Код:
entry = RECORD
author, title: STRING;
year: INTEGER;
CASE tag: entry OF
book: (publisher, cyty: STRING);
magazine:(magName: STRING; volume, issue: INTEGER)
END;
VAR reflist: entry;
BEGIN
reflist.tag := book;
reflist.cyty:= 'NEWYORK';
...
reflist.tag :=magazine;
reflist.volume:= 5;

В КП есть ли что-то подобное записи с вариантами?

Автор:  Иван Денисов [ Воскресенье, 01 Октябрь, 2017 09:02 ]
Заголовок сообщения:  Re: Собственные типы

нет, таких CASE в RECORD не предусмотрено

Автор:  Comdiv [ Воскресенье, 01 Октябрь, 2017 13:59 ]
Заголовок сообщения:  Re: Собственные типы

Александр К писал(а):
чем VAR отличается от TYPE?
Например:
Код:
VAR d1, d2, d3: RECORD
b: INTEGER;
c: BOOLEAN
END;
...
d1:=d2;
Код:
TYPE a = RECORD
b: INTEGER;
c: BOOLEAN
END;
VAR d1, d2, d4: a;
...
d1:=d2;
В обоих примерах присваивание произойдёт.
Потому что в обоих случаях переменные одного и того же типа. Но при задании имени типу через TYPE его можно будет использовать для объявлениях переменных этого типа в других местах. При использовании анонимной записи, переменные этого типа можно объявить только по месту объявления типа перечисленными через запятую именами. По-моему, это очень логично следует из текстового представления.

Автор:  Comdiv [ Воскресенье, 01 Октябрь, 2017 14:16 ]
Заголовок сообщения:  Re: Собственные типы

Александр К писал(а):
В старом Паскале были записи с вариантами (использовался оператор CASE):
Код:
entry = RECORD
author, title: STRING;
year: INTEGER;
CASE tag: entry OF
book: (publisher, cyty: STRING);
magazine:(magName: STRING; volume, issue: INTEGER)
END;
VAR reflist: entry;
BEGIN
reflist.tag := book;
reflist.cyty:= 'NEWYORK';
...
reflist.tag :=magazine;
reflist.volume:= 5;

В КП есть ли что-то подобное записи с вариантами?

Что-то подобное заключается в расширении записей. Наличие этого механизма сделало избыточными менее естественные записи с вариантами.
Код:
TYPE
  entry = EXTENSIBLE RECORD
    author, title: ARRAY 16 OF CHAR;
    year: INTEGER
  END;
  book = RECORD(entry)
    publisher, cyty: ARRAY 16 OF CHAR;
  END;
  magazine = RECORD(entry)
    magName: ARRAY 16 OF CHAR;
    volume, issue: INTEGER
  END;

VAR
  reflist: POINTER TO entry;
  ebook: POINTER TO book;
  emag: POINTER TO magazine;

BEGIN
  NEW(ebook);
  ebook.cyty := 'NEWYORK';
  reflist := ebook;

  NEW(emag);
  emag.volume:= 5;
  reflist := emag

Автор:  Wlad [ Воскресенье, 01 Октябрь, 2017 17:02 ]
Заголовок сообщения:  Re: Собственные типы

Александр К писал(а):
Это понятно, но чем VAR отличается от TYPE?

Есть разный подход "тИповой совместимости" в языках программирования (вернее в их компиляторах).
Совместимость по структуре типа и совместимость по имени типа.
В виртовских языках и языках-"наследниках" паскаля (Модула-2, Оберон, КП, Ада) принята совместимость типов по именам.
Принято перед объявлением переменной, ещё и объявить тип.
Есть случаи послабления этого требования. Но они, чаще всего связаны с низкоуровневыми вещами и, что бы ими воспользоваться, необходимо в программе написать больше слов и приложить усилий.
И ЭТО - ПРАВИЛЬНО.
Для создания надёжных программ пусть лучше программист чётко объяснит компилятору, что он делает, на что решается и от чего отказывается. Действительно низкоуровневое программирование - удел и привилегия относительно небольшого процента разработчиков. Они составляют категорию людей, труд которых связан с, по-настоящему, критичными и опасными вещами.
Когда опасные и рискованные части и фрагменты программ не требуют высокого порога осведомлённости и "дешевы" в затратности и лёгкости использования, у общей массы кодописателей возникает соблазн и убеждение, что "если так можно (и можно легко), то так и надо (и надо всегда и везде)".

В то же время модель совместимости по именам типов значительно упрощает работу компилятора, делает работу анализирующих и проверочных частей проще и формальней. Ведь компилятор должен сравнить только имена, но не начинает детальное сравнение по набору полей, их типов, порядка их расположения в типе/записи, выравнивание и размер.

К тому же, сравнение на идентичность типов по именам намного правильнее методически. Программист именем типа идентифицирует понятие, с которым оперирует в методах и подпрограммах. И он ожидает, что это понятие будет подразумевать одно и то же в разных местах. И в этих местах не нужно проводить "дополнительные уточнения" ни программисту, ни компилятору.

Автор:  Александр К [ Воскресенье, 01 Октябрь, 2017 17:17 ]
Заголовок сообщения:  Re: Собственные типы

Comdiv писал(а):
Что-то подобное заключается в расширении записей.

При этом обязательно придётся наследовать хотябы одно поле. А если не требуется наследование ни одного поля? Записи с вариантами такое позволяли.

Автор:  Rifat [ Воскресенье, 01 Октябрь, 2017 17:35 ]
Заголовок сообщения:  Re: Собственные типы

В Обероне можно наследоваться от пустой записи.

Автор:  Kemet [ Воскресенье, 01 Октябрь, 2017 21:23 ]
Заголовок сообщения:  Re: Собственные типы

В Компонентном Паскале есть же объединения UNION

Автор:  Иван Денисов [ Воскресенье, 01 Октябрь, 2017 21:28 ]
Заголовок сообщения:  Re: Собственные типы

Kemet писал(а):
В Компонентном Паскале есть же объединения UNION

Впервые слышу... а что имеете в виду?

Автор:  Kemet [ Воскресенье, 01 Октябрь, 2017 21:32 ]
Заголовок сообщения:  Re: Собственные типы

T = RECORD [union]
...
END

Автор:  Иван Денисов [ Воскресенье, 01 Октябрь, 2017 21:48 ]
Заголовок сообщения:  Re: Собственные типы

Kemet писал(а):
T = RECORD [union]
...
END

Ясно. Думал, что это с выравниванием связано. Теперь прочитал внимательнее:
Код:
union   7   Untagged record with all fields allocated at offset 0.
      The size of the record is equal to the size of the
      largest field.
      Used to emulate C union types.

Ну это лучше использовать только для привязок к другим библиотекам. А на КП так лучше не писать.

Автор:  Kemet [ Воскресенье, 01 Октябрь, 2017 21:52 ]
Заголовок сообщения:  Re: Собственные типы

Да запихать в нормальную запись на место case и нормально будет

Автор:  Kemet [ Воскресенье, 01 Октябрь, 2017 21:53 ]
Заголовок сообщения:  Re: Собственные типы

человек хочет case в записи, ну так дайте ему и объясните, что почему и зачем. Он сам решит, нужно ему это или нет

Автор:  Иван Денисов [ Воскресенье, 01 Октябрь, 2017 22:12 ]
Заголовок сообщения:  Re: Собственные типы

Kemet писал(а):
человек хочет case в записи, ну так дайте ему и объясните, что почему и зачем. Он сам решит, нужно ему это или нет

Тут соглашусь с Wlad. Не будет работать сборщик мусора, не будут работать проверки. Зачем тогда использовать КП, не понятно.

Автор:  Info21 [ Воскресенье, 01 Октябрь, 2017 22:13 ]
Заголовок сообщения:  Re: Собственные типы

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

Автор:  Kemet [ Понедельник, 02 Октябрь, 2017 09:24 ]
Заголовок сообщения:  Re: Собственные типы

Иван Денисов писал(а):
Kemet писал(а):
человек хочет case в записи, ну так дайте ему и объясните, что почему и зачем. Он сам решит, нужно ему это или нет

Тут соглашусь с Wlad. Не будет работать сборщик мусора, не будут работать проверки. Зачем тогда использовать КП, не понятно.

всё будет, просто нужно объяснить, в каких случаях это может вызвать проблемы, и в не использовать указатели в объединении

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