Search code examples
delphidelphi-xe

Is there a native syntax to access the outer function Result variable from inner function in Delphi?


Consider:

function OuterFunc: integer;
  function InnerFunc: integer;
  begin
    // Here I'd like to access the OuterFunc.Result variable
    // for both reading and writing its value
    OuterFunc.Result := OuterFunc.Result + 12;
  end;
begin
end;

Is there a native syntax to access the OuterFunc Result variable inside InnerFunc? Or is the only way to do this to pass it like a parameter, as in the following?

function OuterFunc: integer;
  function InnerFunc(var outerResult: integer): integer;
  begin
  end;
var
  i: integer;
begin
  i := InnerFunc(Result);
end;

Solution

  • You can assign result to functions by assigning to the function name, which actually was the original way in Pascal:

    function MyFunc: integer;
    begin
      MyFunc := 2;
      // is equal to the following
      Result := 2;
    end;
    

    So in your case you can write

    function OuterFunc: integer;
      function InnerFunc: integer; 
      begin
        OuterFunc := 12;
      end;
    begin
    end;
    

    Beware however, that using the function name in a statement block anyware else than on the left side of the assignment operator results in a recursive call, and is therefore different from how the predefined Result works.

    In other words, you can not access a previously set value of OuterFunc from within InnerFunc. You would need to use e.g. a local variable in the outer scope defined before InnerFunc to be accessible also from InnerFunc:

    function OuterFunc: integer;
    var
      OuterResult: integer;
    
      function InnerFunc: integer; 
      begin
        OuterResult := 0;
        OuterResult := OuterResult + 12;
      end;
    begin
      Result := OuterResult;
    end;
    

    For more details refer to Function Declarations in the documentation.