[fpc-devel] Re: Templates / Generics Syntax
Thomas Schatzl
tom_at_work at gmx.at
Fri Nov 4 12:56:03 CET 2005
> Op Thu, 3 Nov 2005, schreef Mattias Gaertner:
>
>
>>Here is a proposal of the syntax:
>>
>>type
>> TGenericClass<T,F> = class
>> public
>> procedure Add(Item: T; Flag: F);
>> end;
>
>
> This syntax is almost impossible to implement since in one of your other
> mails the symbols to mark the parameters appear in regular source code:
>
> begin
> generictypeA<integer>.create
> end.
>
> It will be very hard for the parser to see the difference in advance
> between:
>
> variable<integer(another_var)
> generic_type<integer
>
> Only when the > symbol is parsed the result is known.
No, already after the second token after the opening "<". It must either
be a ",", or the closing bracket.
Assuming that you disallow something like generic_type<generic_type2<...
Even that limitation can be overcome by disallowing directly nested
generic use specification. Something like
type
TGeneric2 = generic_type2<...>;
generic_type<TGeneric2 ...
could be allowed however.
> Maybe the parser may be able lookup the type first and make a decision
> based on that, but it would be in the middle of a recursive expression
> parse designed for infix operators.
Simply use a second, third, ... lookahead token for the < case.
>
> Also in C++ this sometimes causes trouble where you need to change your
> code notation so the compiler eats it. I don't know if this proposal
> suffers from this mess, but we should avoid at all cost to import it into
> Pascal.
>
From: Mattias Gaertner <nc-gaertnma at netcologne.de>
> On Thu, 3 Nov 2005 19:59:40 +0100 (CET)
> Daniƫl Mantione <daniel.mantione at freepascal.org> wrote:
> Right. I didn't think of that.
>
> What about edged brackets?
>
> type
> TGenericClass[T,F] = class
> public
> procedure Add(Item: T; Flag: F);
> end;
>
> procedure TGenericClass.Add(Item: T; Flag: F);
> // Note: No redundant [T,F] after TGenericClass.
> begin
> end;
>
> type TListOfComponent = TGenericList[TComponent];
>
> Analog:
> type TGenericListClass[T] = class of TGenericList[T];
> type PGenericRecord[T] = ^TGenericRecord[T];
>
> procedure GenericProc[T](Param: T);
> begin
> end;
I think this has a similar problem to the other one. Consider this:
my_procedure[...
where my_procedure isn't an instantiation of a method using the generic
but a function returing an array of something.
Not completely sure whether this is a problem though... depends on the
implementation.
Regards,
Thomas
More information about the fpc-devel
mailing list