[fpc-devel] Re: Templates / Generics Syntax

Mattias Gaertner nc-gaertnma at netcologne.de
Fri Nov 4 13:35:47 CET 2005


On Fri, 04 Nov 2005 12:56:03 +0100
Thomas Schatzl <tom_at_work at gmx.at> wrote:

> > 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.

.. or '.'. E.g. generic<unit.type>

 
> 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.

I second that. We should try to avoid anonymous types
(generic<generic<type>>). It's bad programming style.

 
>[...]
> 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.

You mean for example:
function my_function: TList;
where TList has a default indexed property.

Ok, so (! !) would be better.
But see other mails, about where Delphi goes. It seems they will use the <>
syntax.

 
> Not completely sure whether this is a problem though... depends on the 
> implementation.


Mattias



More information about the fpc-devel mailing list