On Fri, 22 Jul 2011 02:06:48 +0200, Jonathan M Davis <[email protected]>
wrote:
On 2011-07-21 16:54, Andrei Alexandrescu wrote:
On 7/21/11 6:44 PM, Simen Kjaeraas wrote:
> On Thu, 21 Jul 2011 23:40:08 +0200, bearophile
>
> <[email protected]> wrote:
>> Nick Sabalausky:
>>> Crazy, nutty, wacky idea...
>>>
>>> float (a, b, c) = 0.0;
>>
>> I'd like some syntax sugar for tuples in D (especially for their
>> unpacking), that syntax goes against one of the most natural ways to
>> define tuples. So it's not a good idea.
>
> It is highly unlikely that D will ever adopt that syntax for tuples,
> due to the previously much-discussed comma operator (which, while
> uncommon, is useful at times). I believe the syntax that came out on
> top in earlier discussions was the upended hamburger bun, or banana
> syntax:
>
> (| float f, string s |) foo = (| 1.2, "Eh, whut?" |);
Here's a crazy idea:
auto foo = tuple(1.2, "Eh, whut?");
Is this particular case, a built-in syntax buys you nothing, as you
demonstrate. I think that the case that Bearophile is always looking for
is
something like this:
int i;
float f;
(i, f) = tuple(5, 2.2);
Ten minutes of hacking later:
///////////////////////////////////////
import std.typecons;
import std.typetuple;
template getType( alias A ) {
alias typeof( A ) getType;
}
template getType( T ) {
alias T getType;
}
@property
auto unpack( T... )( Tuple!( staticMap!( getType, T ) ) args ) {
foreach ( i, e; T ) {
T[i] = args.field[i];
}
}
unittest {
int n;
string s;
unpack!(n,s) = tuple(4, "O HAI");
assert(n == 4);
assert(s == "O HAI");
}
////////////////////////////////////////////
Please note that this is not heavily tested, and will likely fail under
some (read: many) circumstances.
Adding some more magic, one could probably do things like:
int n;
unpack!(UNUSED, n, UNUSED) = tuple("foo", 4, "bar");
--
Simen