[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