Ты рассуждаешь как схоласт, а не как истинный оберонщик, последователь Вирта.
Ведь что говорят оберонщики: "Вот вам минимальное языковое ядро, для своей задачи расширяйте его как хотите..."
Минимальное "расширение", которое практически не повлияет на эффективность (не требует GC и кучи) и на другие аспекты языка, а также сохранит пресловутую "герметичность", я представляю так:
- Вводится маркер для параметра процедуры (по аналогии с VAR), что этот параметр процедурного типа может быть локальной процедурой из процедуры выше по стеку. Например некий LOCAL:
PROCEDURE p(f: LOCAL PROCEDURE);
- Такая "LOCAL f" может быть только вызвана или передана в другую процедуру, но не может быть приведена к обычной процедурной переменной и не может быть передана по ссылке (VAR).
- Обычная процедурная переменная или процедура может быть передана как LOCAL (хотя можно сделать более интересно, но это отдельная тема).
Такое расширение позволит решить оригинальную задачу. Кроме того, можно попытаться написать хоть какую-нибудь библиотеку алгоритмов - тот же sort/find/for_each без тех ужасов, которые надо городить сейчас. И вообще появятся хоть какие-то зачатки функционального программирования в обероне. В оригинальном виде локальные процедуры в обероне имеют совсем мало смысла (не зря их Вирт собирается выпилить).