[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