Легковесные пространства имен
Пространство имен – это область в программе, в которой не может быть двух одинаковых имен для обозначения различных объектов.
У каждой процедуры или функции есть пространство имен. И имеется глобальное пространство имен, в которое имена, описанные до beginа основной программы.
В разных пространствах имен напротив могут быть одинаковые имена.
В PascalABC.NET существуют также легковесные пространства имен, которые связаны с переменными, описанными внутри блока begin-end. Оказывается, в одном и том же блоке begin-end могут описываться одинаковые имена.
begin begin var i: integer; end; begin var i: integer; end; end.
Здесь каждый подблок begin-end представляет собой легковесное пространство имен. В каждом из них определена переменная i, и компиляция проходит - всё корректно.
Основное правило гласит: в непересекающиеся легковесных пространствах имен можно использовать одинаковые имена.
Аналогично в случае определения переменной в заголовке цикла for также образуется легковесное пространство имен цикла for, простирающееся до конца цикла. Следующая программа также корректна:
begin for var i:=1 to 10 do Print(i); for var i:=1 to 10 do Print(i); end.
Переменная i в первом цикле уже не определена за циклом, поэтому далее в следующем цикле можно использовать переменную с тем же именем.
Напротив, дополнительное правило говорит о том, что если одно легковесное пространство имен вкладывается в другое, то в них нельзя использовать одинаковые имена. Например, программа
begin var i: integer; for var i:=1 to 10 do Print(i); end.
содержит ошибку компиляции - переменная i, определенная в заголовке цикла, входит в пространство имен, вложенное по отношению к пространству имен блока begin-end.
Наконец, еще один интересный случай: переменная определена во вложенном пространстве имен и потом - в основном:
begin for var i:=1 to 10 do Print(i); var i: integer; end.
Здесь компиляция проходит, поскольку действие переменной i в блоке цикла for закончилось к моменту определения в основном блоке.