I read the disussion above and I'll post my thoughts so far below: - we'll use a syntax as close as possible to Chrome, e.g. type TList<T> = class ... end;
- instantiation will be only possible in declaration blocks, not in code blocks: possible: var mylist : TList<integer>; const mylist : TList<integer> = nil; type mylist = TList<integer>; forbidden: procedure p(mylist : TList<integer>); begin ... mylist:=TList<integer>.create; ... end; Maybe we need an exception to this when supporting sub routine templates: procedure<T> p(mylist : TList<T>); begin ... end; but this doesn't lead to an ambigious syntax. - instantiation steps which require code generation are done after main program compilation based on information saved in the unit files, this has some advantages: - several equal instantiations require only one specialisation - it's possible to setup an symbol environment as it has been used in the template definition, so the cyclic unit use problem is void it requires though that a lot symbols of the implementation part of a unit must be written to the unit file if the unit contains a template definition This approach will require some compiler clean ups but that isn't that bad ;) Any comments :)? _______________________________________________ fpc-devel maillist - fpc-devel@lists.freepascal.org http://lists.freepascal.org/mailman/listinfo/fpc-devel