[fpc-devel] Feature announcement: Generic functions, procedures and methods

Sven Barth pascaldragon at googlemail.com
Sun Nov 22 10:32:10 CET 2015

On 22.11.2015 00:04, Anthony Walter wrote:
> Sven, first off, congratulations and we thank you for so much good work.
> in the future do you see a time when type inference could be used?
> S := Add('hello ', 'world');
> I := Add(1, 2);

I honestly don't think that type inference should become part of Pascal, 
it's simply not part of the language philosophy and it would also not 
play well with the need for "specialize" in ObjFPC mode and as long as 
Delphi doesn't introduce it I won't add it only for mode Delphi either.

> Which then brings to mind, will it be possible to get use references to
> generic routines?

If you have read the limitations part of my mail then you should know 
that this is a known limitation and to be addressed in the future.

> type
>    TTransform<T> = function<T>(const A, B: T): T;

FPC already supports this, though the syntax is

=== code begin ===

   TTransform<T> = function(const A, B: T): T;

=== code end ===

Or with added "generic" keyword in case of non-Delphi modes.

> var
>    Transform: TTransform<T>;

This is not a valid type declaration and never will be, because "T" is 
not defined. The correct one is

=== code begin ===

   Transform: TTransform<String>;

=== code end ===

> begin
>    Transform := Add<String>;
>    WriteLn(Transform('hello', 'world'));
>    Transform := Min<String>;
>    WriteLn(Transform('hello', 'world'));
>    Transform := Max<String>;
>    WriteLn(Transform('hello', 'world'));
> end;

This would work once assignments of routines work. In non-Delphi modes 
the syntax will be

=== code begin ===

   Transform := @specialize Add<String>;
   Writeln(Transform('hello', 'world'));

=== code end ===

> function Print<T>(const A, B: T; Transform: TTransform<T>);
> begin
>    WriteLn(Transform(A, B));
> end;
> begin
>    Print('hello', 'world', Add); // type inference
>    Print('hello', 'world', Min);
>    Print('hello', 'world', Max);
> end;

No type inference.


More information about the fpc-devel mailing list