[fpc-devel] Functors

Martin Frb lazarus at mfriebe.de
Mon Dec 27 01:14:54 CET 2021


On 27/12/2021 00:18, Blaise at blaise.ru wrote:
> On 27.12.2021 0:57, Martin Frb via fpc-devel wrote:
>>>     writeln( aC(33) );
>>>     aC('hello');
>> the above examples are probably intended to show the syntax. But not 
>> indented to show any useful application?
>
> The test you quoted demonstrates what is already possible, 
> syntactically and semantically, using a simple patch I have extracted 
> from my implementation of Closures.

No judgment, but just checking if I missed anything... From the above 
examples, it then is a shortcut?

"shortcut" in the sense that it enables you to skip writing the name of 
the method that is called?
"shortcut" in the sense, that anything you can do with it, you can 
already do without it (and without changing the structure of your code, 
or adding massive amounts of code)?

This is what irritates me, if this is a feature, it should enable me to 
do something that otherwise would have been at least some little bit 
more complex.

Functor and class are (as I understand you) equal in:
- you need to create / destroy them.
- you can store data / add (none default) methods
But different in (and only in?), that a functor has a default method.

Your way to describe it "it can be passed as a function" or "behaves 
like a routine" does not add anything new.
A method / method-reference can do exactly all of that.

As I write this I feel, that I really must be missing some point... I 
just don't see where.
(Sorry for the very repetitive questioning about / just wanted to make 
sure I highlight every angle of my current understanding)


>>
>> a functor is meant to be ref-counted
>
> A functor is a non-routine entity ("object") that behaves like a 
> routine. Meaning: you can invoke it like a routine (via an overloaded 
> "operator ()"), you can store it like a routine (in a method pointer). 
> That is all, it is quite a simple feature, really. RECORD, OBJECT, 
> CLASS, and INTERFACE instances are supported as such entities. With 
> these entities, you manage memory as usual.

So basically

type
   TInvoke = procedure of object;

TFunctor = class
   procedure Invoke;
end;

operator := (a: TFunctor): TInvoke;
begin
   result := TInvoke(@a.Invoke);
end;

Only
- I don't need to write the operator by hand, and therefore do not need 
to update the name "invoke" if I change it in the class?
- the above only works in assignments, *not* for directly calling 
"MyFunctor();" (which is where it is a shortcut, to leave out the method 
name)



More information about the fpc-devel mailing list