Task

Create a list of ten functions, in the simplest manner possible   (anonymous functions are encouraged),   such that the function at index    i     (you may choose to start     i     from either    0    or    1),    when run, should return the square of the index,   that is,     i  2.

Display the result of running any but the last function, to demonstrate that the function indeed remembers its value.



Goal

Demonstrate how to create a series of independent closures based on the same template but maintain separate copies of the variable closed over.

In imperative languages, one would generally use a loop with a mutable counter variable.

For each function to maintain the correct number, it has to capture the value of the variable at the time it was created, rather than just a reference to the variable, which would have a different value by the time the function was run.

See also: Multiple distinct objects

program Project1;
 
type
  TFuncIntResult = reference to function: Integer;
 
// use function that returns anonymous method to avoid capturing the loop variable
function CreateFunc(i: Integer): TFuncIntResult;
begin
  Result :=
    function: Integer
    begin
      Result := i * i;
    end;
end;
 
var
  Funcs: array[0..9] of TFuncIntResult;
  i: integer;
begin
  // create 10 anonymous functions
  for i := Low(Funcs) to High(Funcs) do
    Funcs[i] := CreateFunc(i);
 
  // call all 10 functions
  for i := Low(Funcs) to High(Funcs) do
    Writeln(Funcs[i]());
end.