[fpc-devel] Functors

Blaise at blaise.ru Blaise at blaise.ru
Sun Dec 26 19:44:05 CET 2021


On 26.12.2021 17:40, Ryan Joseph via fpc-devel wrote:
> I'm 99% certain using the method name "Invoke" would be rejected on the grounds of backwards compatibility.

Not to argue for the "procedure/function Invoke" syntax, but it hardly breaks backward compatibility. Only in the purest non-practical sense: "I maintain this code that always used to be rejected and suddenly it gets compiled".

> Adding a new syntax using "default" like "function Add9(const N: Integer): Integer; default;"

That is pretty much the /old/ syntax.
I agree with Michael that it would mirror default properties nicely, but:
1) Are we most likely to name that "default method" or "call operator"?
2) We now have proper operator overloading; I would even argue that, were it added to Object Pascal much earlier, we would have had "operator Index" instead of default array properties;
3) I would rather reserve the DEFAULT directive on methods for default interface methods:
-------8<-------
type I = interface
	procedure Foo; default;
	// the above, IMO, looks better than
	//  procedure Foo; not abstract;
end;
procedure I.Foo; begin { default implementation } end;
-------8<-------

> 	class operator Call(....);

Again, the proposal is:
-------8<-------
type R = record
	operator Invoke(...)...;
end;
-------8<-------
Specifically:
A) without CLASS:
	1) Having to declare Self manually would be ridiculous;
	2) In interfaces, that method should be instance-virtual.
B) The name Invoke is required for compatibility with DCC.

Granted, for "operator", some hackery would still be required for 100% DCC compatibility:
-------8<-------
type MethRef = reference to procedure;
type C = class(TInterfacedObject, MethRef)
	// This needs to map to _operator_ MethRef.Invoke
	procedure Invoke;
end;
-------8<-------

> it doesn't present any new syntax

So, in your book, introducing a /new/ operator identifier "doesn't present any new syntax" (and I agree), but semantically allowing the /existing/ directive DEFAULT to appear in the existing list of method directives is somehow "a new syntax". You have some interesting definition of "syntax".

-- 
βþ


More information about the fpc-devel mailing list