On 15 March 2012 09:52, Derek <ddparn...@bigpond.com> wrote: > On Thu, 15 Mar 2012 19:23:57 +1100, Timon Gehr <timon.g...@gmx.ch> wrote: >>> >>> I'd like to break the nexus between science and magic here. >>> >> >> // this is used to access language built-in tuples >> template to(T...) { >> alias T to; >> } >> >> // this builds a struct akin to std.typecons.tuple >> // it contains the function parameters as fields t[0], t[1],... >> auto from(T...)(T t) { >> struct Result { T t; alias t this; } >> return Result( t ); >> } >> >> // to!(a,b) creates a tuple containing aliases to a and b >> >> to!(a,b) = from(b,a); // cannot assign Result to two fields >> to!(a,b) = from(b,a).t; // try alias this >> auto __tmp = from(b,a).t; // expand tuple assign to multiple assignment >> a[0] = __tmp[0], a[1] = __tmp[1]; > > > Thanks, but I was hoping more for an explanation in English. > > Are you saying that the generated code is something like ... > > struct __tmpS { int Fa, int Fb }; > __tempS __tmp; > __tmp.Fa = a; > __tmp.Fb = b; > a = __tmp.Fb; > b = __tmp.Fa; >
In effect, yes. Given that the call to from() is inlined. :-) In GDC, you have a -fdump-tree-original switch that dumps a debug representation (that just so happens to look C-like) of the AST of the code to a file. You could use this to unravel some of the magic going on under the covers. ;-) -- Iain Buclaw *(p < e ? p++ : p) = (c & 0x0f) + '0';