Since I had was already working on generics I wanted to see if I could 
implement the inferred specializations like is available in Delphi. The current 
syntax is too verbose to be usable so this is a necessary improvement in my 
opinion.

Here’s a first draft which seems to be working. There’s probably other ways to 
do the inference (I don’t have Delphi to test there’s) but this what I did for 
now. The algorithm basically scans params in order of appearance and inserts 
unique non-repeating types. For example:

            (1,'string') = <Integer,String>
            (1,2,3,4,5,6) = <Integer>
            ('a','b') = <String>
            ('string',1) = <String,Integer>
            ('a',1,'b',2,'c') = <String,Integer>


https://github.com/genericptr/freepascal/tree/generic_implicit


{$mode objfpc}
{$modeswitch implicitgenerics}

program test;

generic procedure DoThis<T>(msg:T);
begin
        writeln('DoThis$1#1:',msg);
end;

generic procedure DoThis<T>(msg:T;param1:T);
begin
        writeln('DoThis$1#2:',msg,' ',param1);
end;

generic procedure DoThis<T,U>(msg:T);
begin
        writeln('DoThis$2#1:',msg);
end;

generic procedure DoThis<T,U>(msg:T;param1:U);
begin
        writeln('DoThis$2#2:',msg,' ',param1);
end;

generic procedure DoThis<T,U>(msg:T;param1:U;param2:tobject);
begin
        writeln('DoThis$2#3:',msg,' ',param1,' ',param2.classname);
end;

begin
        DoThis(1);                      // DoThis$1#1:1
        DoThis(1,1);                    // DoThis$1#2:1 1
        DoThis('a','a');                // DoThis$1#2:a a
        DoThis('a',1);                  // DoThis$2#2:a 1
        DoThis('a',1,tobject.create);   // DoThis$2#3:a 1 TObject
end.

Regards,
        Ryan Joseph

_______________________________________________
fpc-pascal maillist  -  fpc-pascal@lists.freepascal.org
http://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-pascal

Reply via email to