digitalmars.D.learn - Tuples and array literals
- =?ISO-8859-1?Q?Jari-Matti_M=E4kel=E4?= (24/24) Mar 06 2007 I tried to search the ng and dstress test cases, but there was nothing
- Daniel Keep (16/51) Mar 06 2007 I'm not an expert on Tuples, but I don't think you can alias expression
- =?ISO-8859-1?Q?Jari-Matti_M=E4kel=E4?= (34/76) Mar 07 2007 I'm not an expert either. I found the aliasing from
I tried to search the ng and dstress test cases, but there was nothing about these. So here are the working ones: const a = [1,2]; int[] b = [1,2]; struct foo { const int[] c = [1,2]; const d = [1,2]; } void main() { const e = [1,2]; } These ones don't work: template Tuple(E...) { alias E Tuple; } alias Tuple!(0,1) TP; const a = [ TP ]; int[] b = [ TP ]; struct foo { const int[] c = [ TP ]; const d = [ TP ]; } So, are these going to be fixed in future releases or is there some serious limitation in the template/tuple system that prevents any of these? Any workarounds that make use of tuples?
Mar 06 2007
Jari-Matti Mäkelä wrote:I tried to search the ng and dstress test cases, but there was nothing about these. So here are the working ones: const a = [1,2]; int[] b = [1,2]; struct foo { const int[] c = [1,2]; const d = [1,2]; } void main() { const e = [1,2]; } These ones don't work: template Tuple(E...) { alias E Tuple; } alias Tuple!(0,1) TP; const a = [ TP ]; int[] b = [ TP ]; struct foo { const int[] c = [ TP ]; const d = [ TP ]; } So, are these going to be fixed in future releases or is there some serious limitation in the template/tuple system that prevents any of these? Any workarounds that make use of tuples?I'm not an expert on Tuples, but I don't think you can alias expression tuples like (0,1), for the same reason you can't alias 1 or 2. The solution is the same: put it in a constant. typeof(Tuple!(0,1)) TP = Tuple!(0,1); The problem here is that I'm not sure if assigning between tuples works, either. I remember having to write a loop to do it...foreach( i, e ; tuple ) TP[i] = e;To be honest, I haven't really played with expression tuples all that much, so I could be totally off-base. None the less, something to think about :) -- Daniel -- Unlike Knuth, I have neither proven or tried the above; it may not even make sense. v2sw5+8Yhw5ln4+5pr6OFPma8u6+7Lw4Tm6+7l6+7D i28a2Xs3MSr2e4/6+7t4TNSMb6HTOp5en5g6RAHCP http://hackerkey.com/
Mar 06 2007
Daniel Keep kirjoitti:Jari-Matti Mäkelä wrote:I'm not an expert either. I found the aliasing from http://www.digitalmars.com/d/tuple.html. "Expression Tuples If a tuple's elements are solely expressions, it is called an ExpressionTuple." "It can be used to create an array literal: alias Tuple!(3, 7, 6) AT; ... int[] a = [AT]; // same as [3,7,6]" --- I forgot to mention that in the code I sent b) actually works, but a) doesn't: template Tuple(E...) { alias E Tuple; } alias Tuple!(0,1) TP; const a = [ TP ]; // example a) void main() { static const b = [ TP ]; // example b) } I have used code similar to b) a lot to precalculate tables in my code. I was just curious about the actual reasons to deny the use of a). AFAIK, it can be calculated in compile time and there is also evidence that the tuple in a literal syntax works elsewhere. Something like template Tuple(E...) { alias E Tuple; } alias Tuple!(0,1) TP; const a = [ TP[0], TP[1] ]; also works, but the tuples really should have variable length in my code.I tried to search the ng and dstress test cases, but there was nothing about these. So here are the working ones: const a = [1,2]; int[] b = [1,2]; struct foo { const int[] c = [1,2]; const d = [1,2]; } void main() { const e = [1,2]; } These ones don't work: template Tuple(E...) { alias E Tuple; } alias Tuple!(0,1) TP; const a = [ TP ]; int[] b = [ TP ]; struct foo { const int[] c = [ TP ]; const d = [ TP ]; } So, are these going to be fixed in future releases or is there some serious limitation in the template/tuple system that prevents any of these? Any workarounds that make use of tuples?I'm not an expert on Tuples, but I don't think you can alias expression tuples like (0,1), for the same reason you can't alias 1 or 2.The solution is the same: put it in a constant. typeof(Tuple!(0,1)) TP = Tuple!(0,1);Ok, I have to try this. Thanks. My first impression is that it does not work :) test.d(2): Error: forward reference to type (int, int) test.d(2): Error: cannot implicitly convert expression (tuple(0,1)) of type (int, int) to (int, int) Error: cannot cast int to (int, int)
Mar 07 2007