Denis Koroskin wrote:
On Wed, 21 Oct 2009 22:41:50 +0400, Andrei Alexandrescu
<seewebsiteforem...@erdani.org> wrote:
language_fan wrote:
Wed, 21 Oct 2009 12:35:35 -0500, Andrei Alexandrescu thusly wrote:
language_fan wrote:
void main() {
Tuple!(int,int) a; // typeof(this) *is* the official tuple type
STuple!(int,int) b; // this is actually a struct
a = Tuple!(1,1); // ok
That doesn't work for me at all (with std.typecons.Tuple). I think
there
is confusion about a couple of things. One is that Tuple!(int, int)
is a
type that contains two ints, whereas Tuple!(1, 1) is a type that
contains two compile-time integral values. So if you write:
a = Tuple!(1, 1);
that is as good syntactically as:
a = int;
It might be if we use your definition of tuple. But the mighty
compiler dmd 2.035 himself calls my types constructed with my template
template Tuple(T...) { alias T Tuple; }
a tuple. How do you explain that? If the resulting type is tuple
according to dmd, why do you think it is actually not.
If it works like you say, why does this work then?
Tuple!(int,int) a;
a = Tuple!(12,13);
Here 'a' has a real runtime type (int,int) which is a runtime tuple
according to dmd. And I assign a value to the tuple on runtime. I can
even test it by printing the values a[0] and a[1] with writefln. So
why didn't you just fix this particular tuple type and why did you
come up with a library level hack?
Show me a better way to achieve this with your tuple system.
I don't understand what you are trying to accomplish. As far as I can
tell you want to do this:
Tuple!(int, int) a;
a = tuple(12, 13);
int x = a.field[0];
and similar things. I have no idea why you refuse to do it that way.
int d,e;
Tuple!(d,e) = Tuple!(10,20);
It's still not clear to me why you don't want to add full syntactic
support for built-in tuples. Do you somehow find this kind of code
difficult to read or maintain?
(int,int) a = (1,1);
int e1 = a[0];
writefln(a);
(int,int) retTest() { return (1,1); }
int d,e;
(d,e) = (10,20);
(d,_) = (10,20);
(int,int) b;
(d,b) = (1, retTest());
auto a3b = [ (1,1), (2,2) ];
auto a7 = [ (1,1) : 5 ];
auto a8 = [ 5 : (1,1)];
I want to know what is the rationale behind not accepting this
semantics that is so widely used in other languages (and I very well
mean the languages that *have* built-in tuple types).
To effect this, there'd first be a need to eliminate the current
semantics of the comma operator. I probably find it as useless as the
next guy, and don't take one second to buy into Walter's theory that
it makes it easy to generate code (that may as well be his least
convincing argument to date), but really there's two parts to your
suggestion: (1) eliminate the comma operator, (2) make the comma
operator work for tuples. I suspect there are some syntactical issues
with (2).
Andrei
Well, he could just change the symbol used to denote comma operator to
some other character (if he uses it so heavily internally), and don't
expose it to a user.
I don't use tuples a lot myself, but I would love to have multiple
return types without some clumsy syntax. It's possible even now, but the
syntax is a bit discouraging:
Tuple!(int,float) foo()
{
return tuple(42, -1.0f);
}
make_tuple(a, b) = foo();
as opposed to:
(int, float) foo()
{
return (42, -1.0f);
}
(a, b) = foo();
Or even:
a, b = foo();
or
a, _ = foo();
Works in Python (tm)