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/ |