OberonCore
https://forum.oberoncore.ru/

VAR после объявления вложеных процедур
https://forum.oberoncore.ru/viewtopic.php?f=1&t=6912
Страница 1 из 1

Автор:  arisu [ Среда, 08 Март, 2023 11:23 ]
Заголовок сообщения:  VAR после объявления вложеных процедур

компонентный паскаль, в принципе, очень либерален к количеству секций CONST/TYPE/VAR: парзер просто крутит цикл с проверками, позволяя иметь сколько угодно секций. это удобно для логических группировок. но. в случае вложеных процедур вот так нельзя:
Код:
PROCEDURE a;
  PROCEDURE nested; END nested;
VAR i: INTEGER;
BEGIN
END a;

мне кажется, что это не какое-то идеологическое ограничение, а простой недосмотр: потому что код для разбора как верхнего уровня, так и вложенности один и тот же, а на верхнем уровне допускать такое фуфуфу. тем не менее, в случае вложеных процедур это было бы удобно: иногда бывает, что прячешь nested-ы просто для удобства, и переменные основной функции удобней иметь перед BEGIN. или же можно явно описать все переменные, которые nested-ы используют, перед ними, а остальные после. короче, я тут вижу одно сплошное удобство и никаких особых недостатков.

как вы считаете, коллеги?

Автор:  arisu [ Среда, 08 Март, 2023 13:30 ]
Заголовок сообщения:  Re: VAR после объявления вложеных процедур

в общем, я в LC предварительно сделал так: CONST/TYPE/VAR, потом PROCEDURE, потом допускается ещё CONST/TYPE/VAR, но повторных PROCEDURE уже нельзя. так, мне кажется, правильно: минимизируем мешанину, более-менее чётко указываем, что такая возможность не для хаоса бездумной фигни, а с целью.

p.s.: естественно, на глобальном уровне такой фокус не разрешён.

Автор:  Иван Денисов [ Среда, 08 Март, 2023 15:36 ]
Заголовок сообщения:  Re: VAR после объявления вложеных процедур

В Компонентном Паскале - это нехорошо, так как вложенные процедуры имеют доступ к локальным переменным, следовательно они должны быть выше процедур концептуально. А вот в новом Обероне уже запрещен доступ к локальным переменным, и вот там было бы такая композиция вполне обоснована. Однако именно в симметрии вложенности и есть простота, что мало нейронных связей в голове тратиться на постижение архитектуры модулей. Лучше не менять.

Автор:  arisu [ Среда, 08 Март, 2023 15:58 ]
Заголовок сообщения:  Re: VAR после объявления вложеных процедур

Иван Денисов писал(а):
В Компонентном Паскале - это нехорошо, так как вложенные процедуры имеют доступ к локальным переменным, следовательно они должны быть выше процедур концептуально.
так я именно по этой причине и сделал возможность иметь до и после. идея такая, что все локалы, к которым должны иметь доступ вложеные процедуры, описываются до них, а остальные — после. таким образом, у нас есть гарантия непосредственно от компилятора, что вложеные процедуры могут дёргать только то, что мы им явно разрешили, и мы достигли этого не вводя новых значков для «псевдоэкспорта».

то есть, так:
Код:
PROCEDURE a;
VAR
  v0: INTEGER;

  PROCEDURE nested;
  BEGIN
    INC(v0);
    (* INC(v1); — а так не выйдет, компилятор заругается! *)
  END nested;

VAR
  v1: INTEGER;
  (* а здесть PROCEDURE уже нельзя, всё, только один блок вложеных процедур можно *)
BEGIN
  (* а здесь доступны и v0, и v1 *)
END a;

то же самое относится и к константам, и к типам.

p.s.: для global scope это малооправдано, получится каша. поэтому на глобальном уровне такое запрещено.

Автор:  arisu [ Среда, 08 Март, 2023 16:21 ]
Заголовок сообщения:  Re: VAR после объявления вложеных процедур

я вообще думаю радикально всё испортить, и сделать требование, чтобы весь доступ к локалам уровня выше явно указывался. типа такого:
Код:
PROCEDURE a;
VAR
  v0: INTEGER;

  PROCEDURE nested;
  BEGIN
    INC(UPSCOPE.v0) (* без UPSCOPE не прокатит, компилятор заругается *)
  END nested;

BEGIN
  …
END a;

идея такая, что это «грязный» доступ, который лучше явно помечать. совсем его убирать слишком радикально: это часто удобно. но сделать его чуть-чуть неудобным и явно видимым — мне кажется, имеет смысл. конечно, не в рамках CP уже, увы — но мне с Ultra Pascal можно. ;-)

Автор:  Иван Денисов [ Среда, 08 Март, 2023 16:50 ]
Заголовок сообщения:  Re: VAR после объявления вложеных процедур

arisu писал(а):
я вообще думаю радикально всё испортить, и сделать требование, чтобы весь доступ к локалам уровня выше явно указывался. типа такого:
Код:
PROCEDURE a;
VAR
  v0: INTEGER;

  PROCEDURE nested;
  BEGIN
    INC(UPSCOPE.v0) (* без UPSCOPE не прокатит, компилятор заругается *)
  END nested;

BEGIN
  …
END a;

идея такая, что это «грязный» доступ, который лучше явно помечать. совсем его убирать слишком радикально: это часто удобно. но сделать его чуть-чуть неудобным и явно видимым — мне кажется, имеет смысл. конечно, не в рамках CP уже, увы — но мне с Ultra Pascal можно. ;-)


Если такие штуки как-то сделать с помощью вызова SYSTEM, то это будет лучше, так как связано с особенностью реализации, а не с изменением языка. Так как изменение локальных переменных вложенными процедурами - достаточно частный источник возможных ошибок, то в целом - правильная инициатива для повышения надёжности.

Автор:  arisu [ Среда, 08 Март, 2023 18:47 ]
Заголовок сообщения:  Re: VAR после объявления вложеных процедур

Иван Денисов писал(а):
Если такие штуки как-то сделать с помощью вызова SYSTEM, то это будет лучше, так как связано с особенностью реализации, а не с изменением языка. Так как изменение локальных переменных вложенными процедурами - достаточно частный источник возможных ошибок, то в целом - правильная инициатива для повышения надёжности.
с SYSTEM, мне кажется, перебор. к тому же я требую помечать UPSCOPE любой доступ, а не только изменение (так проще). импортировать SYSTEM для штатной фичи языка как-то… не надо, по-моему. а вот сделать код с идеологически некрасивой штукой чуть более некрасивым, и чуть более заментым — самое то.

p.s.: так-то потребовать импорта SYSTEM при доступе (любом) к outer locals несложно, там буквально одна проверка. если только для изменений — то сложнее будет, размазано по компилятору уже. но таки это получается перегруз SYSTEM, который предназначен строго-строго для вещей, которые «не влезай — убьёт!»

Автор:  Александр Ильин [ Пятница, 09 Июнь, 2023 18:45 ]
Заголовок сообщения:  Re: VAR после объявления вложеных процедур

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

Автор:  arisu [ Пятница, 09 Июнь, 2023 19:25 ]
Заголовок сообщения:  Re: VAR после объявления вложеных процедур

вы таки будете смеяться, но `UP.` у меня как раз работает как указатель уровня (это проверяется, правильные уровни выбираются). не поверите: удобно. в том числе и для вот таких финтов:
Код:
PROCEDURE A;
VAR n: INTEGER;
   PROCEDURE B;
   VAR n: INTEGER;
   BEGIN n := UP.n; закэшировали, юзаем n без UP
   END B;
BEGIN END A;

Автор:  arisu [ Пятница, 09 Июнь, 2023 20:41 ]
Заголовок сообщения:  Re: VAR после объявления вложеных процедур

ну и да, для доступа к глобалам есть `GLOBAL.`. но оно не энфорсится, потому что очень уж много кода ломается. а так-то надо бы, для вящей чистоты. разве что переименовать в какое-нибудь `GG`, а то больно длинно.

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