digitalmars.D.learn - templates in functions
- BCS (33/33) Jul 27 2007 Why can't templates be put into functions like this
- Jari-Matti =?ISO-8859-1?Q?M=E4kel=E4?= (13/26) Jul 28 2007 Templates seem to be tightly anchored to the module level at the moment ...
-
BCS
(2/9)
Jul 29 2007
Should I add that to my talk at the conference?
Why can't templates be put into functions like this
|void foo()
|{
| template Bar(int i){int Bar;}
|
| Bar!(5) = 7;
| Bar!(12) = 3;
| writef("%s, %s\n", Bar!(5), Bar!(12));// prints "7, 3"
|}
this would be vary useful in templated code where a number of variables need
to be declared outside of the scope where they will be used
|void foo(A...)()
|{
| template Bar(int i){int Bar = 0;}
|
| while(cond())
| {
| foreach(i, v; A)
| Bar!(i) = A(Bar!(i)); // values not reset
| }
|}
(in this case, trivial work around exist but I have run into cases where
it is much harder to work out a solution)
I don't think that this would cause problems because the template could only
be used inside the function and therefor by the end of the semantic pass
all instances of the template would be known.
for this case a short hand syntax might even be worthwhile, but I can't think
what it would be.
int Bar(int i) = 0; // looks like a fn decoration
int(int i) Bar = 0; // ??
int template(int i) Bar = 0; // just looks odd
template(int i) int Bar = 0; // template ID( args ) [ decoration | '{'
decorationList
'}' ]
Jul 27 2007
BCS wrote:
Why can't templates be put into functions like this
|void foo()
|{
| template Bar(int i){int Bar;}
|
| Bar!(5) = 7;
| Bar!(12) = 3;
| writef("%s, %s\n", Bar!(5), Bar!(12));// prints "7, 3"
|}
this would be vary useful in templated code where a number of variables
need to be declared outside of the scope where they will be used
Templates seem to be tightly anchored to the module level at the moment so
this isn't possible. But what you're doing here is pretty straightforward
extension to the current syntax.
I have a suggestion. Why not collect a list of necessary metaprogramming use
cases / constructs (also those that are not possible today) and model a new
system that covers them in a clean way (in case you're not doing something
like that already <g>). Although it may be by pure luck that many of the
current constructs are fixable incrementally at least to some extend. C++
templates are an abomination of the complete metaprogramming frameworks
that languages like Lisp possessed. Currently implementation difficulties
seem to drive the language evolution, which is quite unfortunate in my
opinion. :-/
Jul 28 2007
Reply to Jari-Matti Mäkelä,I have a suggestion. Why not collect a list of necessary metaprogramming use cases / constructs (also those that are not possible today) and model a new system that covers them in a clean way (in case you're not doing something like that already <g>).Should I add that to my talk at the conference? <G>
Jul 29 2007








BCS <ao pathlink.com>