static arrays becoming value types

grauzone none at example.net
Wed Oct 21 13:12:34 PDT 2009


Denis Koroskin wrote:
> On Wed, 21 Oct 2009 22:41:50 +0400, Andrei Alexandrescu 
> <SeeWebsiteForEmail at 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)



More information about the Digitalmars-d mailing list