OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Четверг, 18 Апрель, 2024 08:17

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




Начать новую тему Ответить на тему  [ Сообщений: 10 ] 
Автор Сообщение
СообщениеДобавлено: Среда, 08 Март, 2023 11:23 

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

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

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


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 08 Март, 2023 13:30 

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

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


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 08 Март, 2023 15:36 
Аватара пользователя

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


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 08 Март, 2023 15:58 

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

то есть, так:
Код:
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 это малооправдано, получится каша. поэтому на глобальном уровне такое запрещено.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 08 Март, 2023 16:21 

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

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

BEGIN
  …
END a;

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


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 08 Март, 2023 16:50 
Аватара пользователя

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

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

BEGIN
  …
END a;

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


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


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 08 Март, 2023 18:47 

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

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


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Пятница, 09 Июнь, 2023 18:45 
Аватара пользователя

Зарегистрирован: Вторник, 19 Сентябрь, 2006 21:54
Сообщения: 2449
Откуда: Россия, Томск
Предлагаю также добавить поддержку произвольного числа UPSCOPE.UPSCOPE.UPSCOPE..., и доступ к глобальным переменным модуля тоже разрешать только через соответствующее число UPSCOPE.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Пятница, 09 Июнь, 2023 19:25 

Зарегистрирован: Воскресенье, 25 Декабрь, 2022 23:14
Сообщения: 1164
вы таки будете смеяться, но `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:45, всего редактировалось 1 раз.

Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Пятница, 09 Июнь, 2023 20:41 

Зарегистрирован: Воскресенье, 25 Декабрь, 2022 23:14
Сообщения: 1164
ну и да, для доступа к глобалам есть `GLOBAL.`. но оно не энфорсится, потому что очень уж много кода ломается. а так-то надо бы, для вящей чистоты. разве что переименовать в какое-нибудь `GG`, а то больно длинно.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 10 ] 

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


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

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


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

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