[fpc-pascal] Suggestion about ability to pass local procedures as variables

Max Vlasov max.vlasov at gmail.com
Tue Nov 30 15:04:57 CET 2010


On Tue, Nov 30, 2010 at 12:26 PM, Vincent Snijders <
vincent.snijders at gmail.com> wrote:

> 2010/11/30 Max Vlasov <max.vlasov at gmail.com>:
> > So, I suppose that implementing closures is not in real plans (it's ok, I
> > can live with that), but what about the second, is it possible?
> >
> > I will glad to hear different opinions from the developers
> >
>
> Nested procedural variables are a new feature in fpc 2.5.1. See:
> http://svn.freepascal.org/cgi-bin/viewvc.cgi?view=rev&revision=15656
>
> I don't know if that is what you are asking for.
>
>

I'm really impressed. Did a quick test in the fpc ide. It's not just a more
elegant way to keep local context, , it's also more universal callback
compatible with any destination (local, global, object). If anyone is
interested, see it in the example below.

Max


program test;

{$mode delphi}
{$modeswitch nestedprocvars}

type
 TCallBackProc = procedure(Value: integer) is nested;

procedure EnumValues(const Proc: TCallBackProc; Count: integer);
begin
  while Count >= 0 do
  begin
    Dec(Count);
    Proc(Count)
  end;
end;

 { ************** Callback is a local procedure inside another procedure
*************** }

function EnumUserProc: integer;
var
  TotalCount: integer;

  procedure CallBackHere(Value: integer);
  begin
    Inc(TotalCount, Value);
  end;

begin
  TotalCount:=0;
  EnumValues(CallBackHere, 10);
  Result:=TotalCount;
end;

{ **************** Callback is a procedure (classic) ************* }

var
  TotalCount2: integer;

procedure CallBackHere2(Value: integer);
begin
  Inc(TotalCount2, Value);
end;

function EnumUserProc2: integer;
begin
  TotalCount2:=0;
  EnumValues(CallBackHere2, 10);
  Result:=TotalCount2;
end;

{ ************* Callback is a local procedure inside a method
**************** }

type
  TTestObject = class(TObject)
    function EnumUserProc3: integer;
  end;

function TTestObject.EnumUserProc3: integer;

var
 TotalCount3: integer;

 procedure CallBackHere3(Value: integer);
 begin
   Inc(TotalCount3, Value);
 end;

begin
  TotalCount3:=0;
  EnumValues(CallBackHere3, 10);
  Result:=TotalCount3;
end;

begin
  Writeln('Result 1 is ', EnumUserProc());
  Writeln('Result 2 is ', EnumUserProc2());
  with TTestObject.Create do
  begin
    Writeln('Result 3 is ', EnumUserProc3());
    Free;
  end;
end.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.freepascal.org/pipermail/fpc-pascal/attachments/20101130/b6b5a7c5/attachment.html>


More information about the fpc-pascal mailing list