OberonCore
https://forum.oberoncore.ru/

Ссылки на (еще) не определенный тип
https://forum.oberoncore.ru/viewtopic.php?f=29&t=6609
Страница 1 из 1

Автор:  adimetrius [ Вторник, 05 Май, 2020 12:31 ]
Заголовок сообщения:  Ссылки на (еще) не определенный тип

Коллеги,
Сообщение о языке позволяет ссылаться на (еще) не определенный тип. В разделе 4:

3. A declaration of a type T containing references to another type T1 may occur at a point where T1 is still unknown. The declaration of T1 must follow in the same block to which T is local;

Это единственное исключение из правила, что идентификатор должен быть объявлен прежде, чем использован. Оно сделано, очевидно, для определения взаимно ссылающихся типов. Однако, строго следуя формулировке Сообщения, получается возможным сделать так:

TYPE B = RECORD(A) END;
A = EXTENSIBLE RECORD END;

Пользы в этом нет: расширение всегда можно определить после базы, даже если они взаимно ссылаются.

Оказывается, компилятор Dev реализует эту возможность. Но для этого предпринимаются специальные усилия.

Как полагаете, можно ли ограничить использование неопределенных идентификаторов типами полей (и запретить их в указании базового типа) и элементов массивов? Это позволило бы несколько упростить компилятор(ы).

Автор:  Rifat [ Вторник, 05 Май, 2020 18:02 ]
Заголовок сообщения:  Re: Ссылки на (еще) не определенный тип

В Oberon-07 сказано:
Цитата:
If a type P is defined as POINTER TO T, the identifier T can be declared textually following the declaration of P, but [if so] it must lie within the same scope.

То есть обязательно должен быть указатель на неопределенный тип.

Автор:  adimetrius [ Вторник, 05 Май, 2020 19:48 ]
Заголовок сообщения:  Re: Ссылки на (еще) не определенный тип

adimetrius писал(а):
Как полагаете, можно ли ограничить использование неопределенных идентификаторов типами полей (и запретить их в указании базового типа) и элементов массивов? Это позволило бы несколько упростить компилятор(ы).


Рифат, спасибо за поправку, я упустил:
Как полагаете, можно ли ограничить использование неопределенных идентификаторов типами полей (и запретить их в указании базового типа), базовыми типами указателей и типами элементов массива? Это позволило бы несколько упростить компилятор(ы).

Автор:  Александр Ильин [ Вторник, 05 Май, 2020 20:21 ]
Заголовок сообщения:  Re: Ссылки на (еще) не определенный тип

В вашем примере надо A от B тоже унаследовать.

Автор:  adimetrius [ Вторник, 05 Май, 2020 21:56 ]
Заголовок сообщения:  Re: Ссылки на (еще) не определенный тип

Александр Ильин писал(а):
В вашем примере надо A от B тоже унаследовать.

Вы шутите, конечно.

Однако доля правды в этой шутке есть - действительно, в Сообщении о языке нигде прямо или косвенно не запрещается "взаимное расширение". И хотя, конечно, практического смысла во взаимном расширении нет, и даже умозрительного смысла нет - однако в Сообщении небольшая брешь.

Единственное ограничение структурного включения - A structured type cannot contain itself. Однако расширенный тип и базовый тип - это не Itself. Можно дополнить вот так: A structured type cannot contain itself or it's extensions.

Автор:  Илья Ермаков [ Среда, 06 Май, 2020 15:49 ]
Заголовок сообщения:  Re: Ссылки на (еще) не определенный тип

Надо посмотреть ещё на всякие тонкие случаи, типа как с процедурными переменными.

Когда сначала процедурный тип, у которого параметр - RECORD, а потом RECORD, у которого полем тот процедурный тип.

Автор:  adimetrius [ Среда, 06 Май, 2020 19:16 ]
Заголовок сообщения:  Re: Ссылки на (еще) не определенный тип

Илья Ермаков писал(а):
Надо посмотреть ещё на всякие тонкие случаи, типа как с процедурными переменными.

Когда сначала процедурный тип, у которого параметр - RECORD, а потом RECORD, у которого полем тот процедурный тип.


Согласен, в формальных параметрах (процедурного типа) тоже нужно допускать (еще) не определенные типы.

Но в указании базового типа стоило бы запретить. Напр так (раздел 4):
3. A declaration of a type T containing references to another type T1 may occur at a point where T1 is still unknown, unless T is a record type and T1 is a base type of T. The declaration of T1 must follow in the same block to which T is local;

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