ローカル関数?

ネストしまくっても大丈夫らしい。

program nested;

{$APPTYPE CONSOLE}

uses
  SysUtils;

function Foo(i: Integer): Integer;
  procedure Bar;
    procedure Fizz;
      procedure Buzz;
      begin
        i := i + 1;
        WriteLn(Format('Buzz:%d', [i]));
      end;
    begin
      Buzz;
      i := i + 1;
      WriteLn(Format('Fizz:%d', [i]));
    end;
  begin
    Fizz;
    i := i + 1;
    WriteLn(Format('Bar:%d', [i]));
  end;
begin
  Bar;
  Result := i + 1;
  WriteLn(Format('Foo:%d', [Result]));
end;

begin
  WriteLn(Format('Main:%d', [Foo(0)]));
end.

出力

>nested.exe
Buzz:1
Fizz:2
Bar:3
Foo:4
Main:4