> On Nov 6, 2018, at 11:19 PM, Sven Barth via fpc-pascal 
> <fpc-pascal@lists.freepascal.org> wrote:
> 
> Complex inline specializations containing, for example a multiplication with 
> specializations on the left and the right side are currently not possible in 
> mode Delphi. In addition to that Delphi allows overloads of generic types 
> with variables and constants, so when the parser encounters "Bla<N" and has 
> not yet encountered the ">" it does not know whether it needs to start a 
> specialization or an expression. This is already annoying enough to solve 
> with merely types, but if the right side of the "<" can also take constants 
> for generics that gets downright proplematic. 

Can you show full a code example? If it really is so problematic because of 
something Delphi does then maybe it’s best left to objfpc mode until it can be 
resolved.

> Specialization is an expensive operation. When the compiler can already 
> decide that "Something<SomeType, SomeOtherType>" can never be valid, because 
> it's declared as "Something<T, const N>", then this is preferable. Otherwise 
> the user might get some cryptic error message during the specialization, 
> because "SomeOtherType" is used where only a constant can be used. 
> Pascal is considered a type safe language and without forcing users to 
> decorate such parameters as "const" you essentially allow users to mix types 
> and constants. 
> Not to mention that parsing the generic can already be done more correctly 
> then it could be if the parameter is a typesym (which it would be right now). 
> You can't do e.g. "const SomeOtherConst = ConstParam * Pi" that way as it 
> would mean to ease up the compiler's restrictions for type checking even 
> more. 

I guess if you include const it could save some compile time if you tried to 
specialize with the wrong type? It’s a pretty minor savings but that’s ok.

type
        generic TList<T,const U> = record
                list: array[0..U-1] of T;
                function capacity: integer;
        end;

Btw I only implemented this with integers (no strings or floats) because afaik 
this feature is only useful for arrays. I guess you could use non-ints for 
default parameters but this is probably a stupid idea because of how much 
compile time you’ll add to specialize a large amount of types.

Is there any reason to support strings and floats?

type
        generic TCaller<T,const U> = record
                procedure Say(message:T = U);
        end;

var
        caller: specialize TCaller<string,’hello’>;
begin
        caller.Say;

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