クロージャやカリー化や

[id:lethevert:20050915:p4]
局所的オブジェクトを生成すれば、Delphiには、procedure of objectがあるので、クロージャを作るのはそんなに難しくないはず。ただ、揮発的なクロージャとしてしか使えないという制限がありますが。
それに、こちら(http://www-6.ibm.com/jp/developerworks/java/050922/j_j-pg08235.shtml)で見られるように、クロージャが可能なら、カリー化も同じ方法でできますからね。
コードにすればこんな感じですが、pp4dでは、自動生成させたいですね。

//クロージャを受け取る関数
type
  TPrintStringFunc = procedure (str: string) of object;
procedure PrintString(func: TPrintStringFunc; str: string);
begin
  func(str);
end;

//クロージャオブジェクト
type
  TLocalObject = class
    form: TForm1;
    procedure print(str: string);
  end;
procedure TLocalObject.print(str: string);
begin
  form.ResultMemo.Lines.Add(form.EdClosure2.Text + str);
end;

//クロージャを使った呼び出し
procedure TForm1.BtClosureClick(Sender: TObject);
var
  obj: TLocalObject;
begin
  obj := TLocalObject.Create; // <-- クロージャオブジェクトの局所的な生成
  obj.form := Self;
  PrintString(obj.print, EdClosure.Text);
  obj.Free;
end;

クラスの宣言が、関数内にできないのは困りものですね。まあ、プリプロセッサを通すつもりだから関係ないですけど。
え?これのどこがクロージャかって?
つまり、下のようなコードから、プリプロセッサを通して上のコードを生成しようと考えているから、クロージャだといえるんです。

//クロージャを受け取る関数
type
  TPrintStringFunc = procedure (str: string) of object;
procedure PrintString(func: TPrintStringFunc; str: string);
begin
  func(str);
end;

//クロージャを使った呼び出し
procedure TForm1.BtClosureClick(Sender: TObject);
begin
  PrintString(
    [: str
     | Self.ResultMemo.Lines.Add(Self.EdClosure2.Text + str);
    ]
    , EdClosure.Text);
end;