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

Chriss Kalogeropoulos iz.iznogood at gmail.com
Mon Nov 23 13:12:09 CET 2015


Hi all,

If type inference is not planned, then do you have an alternative to
support linq like expression methods ? If type inference is not used then
the syntax is very verbose if not ugly.

Also I though that type inference is kind of important for proper lambda
support but I might be wrong.

Anyways congratulations, very nice feature.

Thank you

Chriss Kalogeropoulos
On Nov 22, 2015 11:32 AM, "Sven Barth" <pascaldragon at googlemail.com> wrote:

> 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 ===
>
> type
>   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 ===
>
> var
>   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.
>
> Regards,
> Sven
>
> _______________________________________________
> fpc-devel maillist  -  fpc-devel at lists.freepascal.org
> http://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-devel
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.freepascal.org/pipermail/fpc-devel/attachments/20151123/f1319d4a/attachment.html>


More information about the fpc-devel mailing list