クロージャやカリー化や
[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;