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

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

BEGIN
  …
END a;
```

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