[fpc-pascal] Re: Delphi's anonymous functions in Free Pascal

Bernd prof7bit at googlemail.com
Sat Nov 5 19:42:10 CET 2011


2011/10/25  <michael.vancanneyt at wisa.be>:

>> targethread.queue(
>>  procedure(targetobject:ttargetobject;a:integer;b:someobject;c:string)
>>             begin
>>               targetobject.destinationprocedure(a,b,c);
>>             end;
>>
>> Note how common this looks compared to the original.
>
> One point is that you could do the above with a local (and named) procedure
> as well, and still have all the context. At the very least you would not be
> raping pascal's readability by putting a
> complete procedure declaration inside a code block.

How would you preserve the context without finding some place
somewhere (on the heap) to store the current values of a, b, and c?


The natural alternative to a closure if you don't have them in an OO
language is instead of passing a closure you pass an object (this
pattern is called Functor). The object contains the function along
with some state. Of course in a static language this involves a lot of
boiler plate to define the needed classes with their methods (one
class definition for every different closure) but once you have done
this you can use it like the closure in the above example and its
usage is totally readable:

targetthread.queue(TMyFunctor.Create(targetobject, a, b, c));



More information about the fpc-pascal mailing list