Mattias Gaertner wrote:
On Fri, 04 Nov 2005 13:44:55 +0100
Marc Weustink <[EMAIL PROTECTED]> wrote:
Mattias Gaertner wrote:
On Fri, 04 Nov 2005 10:47:42 +0100
Marc Weustink <[EMAIL PROTECTED]> wrote:
Daniël Mantione 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.
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.
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.
On the wiki pages some of my remarks got lost (or I didn't write them
down) but when I first looked at the <> notation style it looks very
unpascalish for me. I like more to add a new keyword for it, like the
samples wiht generic or template)
BTW,
what woud be the problem with
type
TMySpecificClass = TGenericClass(TObject, Integer);
What about proc generics:
GenericProc(TObject)
This can be ambigious.
How would you have declared the proc, and how do you call it. I don't
see a problem yet.
GenericProc(TObject)(some params) you mean ?
Example:
procedure MyProc(T); // generic procedure without parameters
ver i: T;
begin
...
end;
Therefor I propose it to use the generic keyword ->
generic procedure MyProc(T); // generic procedure without parameters
var i: T;
begin
...
end;
procedure MyProc(T: TClass); // non generic procedure
begin
end;
This should give a duplicate Identifier error.
or when we usae a syntax similar Micha proposes (I changed the of):
<code>
type
TGenericProc = generic(T) of procedure(param, param)
... use T
end;
TObjectProc = TGenericProc(TObject)
generic(T) procedure MyGenericProc(...)
begin
end;
</code>
<code>
type
TGenericCollection = generic(T: TCollectionItem) of class(TComponent)
...implement TCollection and use T
end;
TCollection = TGenericCollection(TCollectionItem);
TFieldDefs = TGenericCollection(TFieldDef);
</code>
And:
<code>
type
TGenericList = generic(T: PtrInt) of class(TObject)
...implement TList and use PtrInt size for code generation
end;
TList = TGenericList(Pointer);
</code>
Marc
_______________________________________________
fpc-devel maillist - fpc-devel@lists.freepascal.org
http://lists.freepascal.org/mailman/listinfo/fpc-devel