PascalABC.NET
October 11, 2022

Легковесные пространства имен

Пространство имен – это область в программе, в которой не может быть двух одинаковых имен для обозначения различных объектов.

У каждой процедуры или функции есть пространство имен. И имеется глобальное пространство имен, в которое имена, описанные до 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 закончилось к моменту определения в основном блоке.