> -- Илья Ермаков писал(а):
> Самый очевидный минус от этого связан с декларациями абстрактных интерфейсов.Возникает разрыв в определении целостной сущности. Да, у нас, типа, есть вьювер символьников, но зачем иметь лишний разрыв и в исходнике, это раз, приличная часть мыслепроцесса может идти ещё на этапе псевдокода, когда для компиляции ещё чего-то не хватает (а проектирование интерфейсов - это не то, что алгоритмизация, где принцип - компилируй на каждой итерации уточнения, действительно, рулит).Т.е. просто разрешением чередования объявлений и процедур мы бы снимали "малой кровью", без изменения основной грамматики языка, то, что в Активном Обероне, Зонноне и др. вообще "решено" по мейнстримному: всовыванием методом между RECORD/OBJECT и END.Ну и финальное, от чего, собственно, я и вышел на такое предложение. А зачем чередовать-то с обычными процедурами, вы спросите?Мы много обсуждали на прошедшей конференции песпективы построения над КП/ББ предментно-ориентированных инструментов, с высокоуровневыми описаниями.Соответственно, если часть модуля порождается из высокоуровневых описаний (в документах ББ, возможно, прямо внедрённых - или лежащих в смежных документах), то этот автогенерируемый код в большинстве случаев должен содержать и объявления, и процедуры.И в текущем синтаксисе придётся метить две зоны подстановки такого кода, как минимум.Вместо того, чтобы просто иметь секцию в модуле, которая целиком описана как-то инструментально.
Если у вас генерируется какой-то код из описания, то не очень сложно сделать так, чтобы разные части этого кода записывались в различные места. Так что, это не очень большая проблема.

Если разрешить описывать процедуры до VAR, то нужно определить как будет вести себя следующий код:
## Код:
```
VAR A: INTEGER;

PROCEDURE P(): INTEGER;
BEGIN
  RETURN A+ B
END P;

VAR B: INTEGER;
```

A и B являются глобальными переменными, поэтому с одной стороны они должны быть видимы внутри процедуры P. С другой стороны B описывается ниже, чем P, поэтому B может быть невидима внутри P и может быть ошибка компиляции, что B не определено. Если принять решение, что все глобальные переменные видны внутри процедуры, то чтобы найти эти глобальные переменные нужно будет просматривать исходник от начала и до конца. Если же, принять решение, что объявления, которые находятся ниже не видны, то может получиться ситуация, что от простого копирования функции в другое место, возникают или исчезают различные синтаксические ошибки.