Should the comma operator be removed in D2?
Yigal Chripun
yigal100 at gmail.com
Tue Nov 17 12:20:06 PST 2009
Robert Jacques wrote:
> On Tue, 17 Nov 2009 11:38:19 -0500, Bill Baxter <wbaxter at gmail.com> wrote:
>
>> On Tue, Nov 17, 2009 at 7:09 AM, Robert Jacques <sandford at jhu.edu> wrote:
>>> On Tue, 17 Nov 2009 05:44:31 -0500, downs <default_357-line at yahoo.de>
>>> wrote:
>>>
>>>> Robert Jacques wrote:
>>>>>
>>>>> On Tue, 17 Nov 2009 00:06:27 -0500, Yigal Chripun <yigal100 at gmail.com>
>>>>> wrote:
>>>>>
>>>>>> Robert Jacques wrote:
>>>>>>>
>>>>>>> On Mon, 16 Nov 2009 17:53:45 -0500, Stewart Gordon
>>>>>>> <smjg_1998 at yahoo.com> wrote:
>>>>>>>
>>>>>>>> dsimcha wrote:
>>>>>>>> <snip>
>>>>>>>>>
>>>>>>>>> Axe. Looks like the only things it's good for are making code
>>>>>>>>> undreadable and
>>>>>>>>> abusing for loop syntax to...
>>>>>>>>> Make code unreadable.
>>>>>>>>
>>>>>>>> <snip>
>>>>>>>>
>>>>>>>> Suppose you want the increment of a for loop to change two
>>>>>>>> variables
>>>>>>>> in parallel. I don't call that making code unreadable.
>>>>>>>>
>>>>>>>> Stewart.
>>>>>>>
>>>>>>> Yes the classic use case of the comma operator is multi-variable
>>>>>>> declarations/increments in a for loop.
>>>>>>
>>>>>> This was argued before and as I and others said before, this is *not*
>>>>>> a use case for the comma separator.
>>>>>>
>>>>>> e.g.
>>>>>> for (int a = 0, b = 1; condition(); a++, b++) {...}
>>>>>>
>>>>>> int a = 0, b = 1 // this is a declaration and not an expression
>>>>>>
>>>>>> a++, b++ // isn't assigned to any variable and can be treated as a
>>>>>> tuple
>>>>>>
>>>>>> the only use case that will break is if the two increments are
>>>>>> dependent on the order (unless tuples are also evaluated from left to
>>>>>> right):
>>>>>> e.g.
>>>>>> a + 5, b + a //
>>>>>>
>>>>>> I doubt it very much that anyone ever uses this, it's too unreadable
>>>>>> to be useful.
>>>>>
>>>>> However, I imagine tuple(a++,b++) would have some overhead, which is
>>>>> exactly what someone is trying to avoid by using custom for loops.
>>>>>
>>>>> Personally, I like using a..b => tuple(a,b), since it also solves the
>>>>> multi-dimensional slicing and mixed indexing and slicing problems.
>>>>
>>>> Zero overhead. Tuples are flat compile-time entities.
>>>
>>> There are compile time tuples and runtime tuples. D already has a
>>> form of
>>> compile-time tuples. This discussion seems to be about runtime tuples
>>> which
>>> currently don't have a nice syntax: you have to use tuple(a,b). And
>>> tuple(a,b) does have runtime overhead.
>>
>> I think the point is that in something like this:
>> auto foo = (a,b);
>> foo.a += 2;
>> foo.b += foo.a;
>> // etc
>>
>> The tuple foo is allocated on the stack and the compiler knows where
>> the a part and b part are, so the code generated should be absolutely
>> no different from the code generated for:
>>
>> auto foo_a = a;
>> auto foo_b = b;
>> foo_a += 2;
>> foo_b += foo_a;
>> // etc
>>
>> So there doesn't need to be any "tuple overhead".
>> --bb
>
> But that isn't the expansion:
> for (int a = 0, b = 1; condition(); a++, b++) =>
>
> int a = 0;
> int b = 0;
> while(condition) {
> auto temp = tuple(a++,b++); // creation of a struct on the stack
> }
>
> Now the optimizer might get rid of that temporary struct. Then again it
> might not (or its presence interferes with other optimizations). At the
> very least, some amount of code profiling or disassembly needs to be done.
why would it create a struct?
it would probably do:
int a = 0, b = 0;
while (condition) {
int temp_a = (a++); // temp_a == a + 1
int temp_b = (b++);
}
the above would most like be optimized by away.
you can also take advantage of tuples with for loops, something like:
for ( auto t = (0, 0); condition(); (t[1]++, t[2]++) ) {...}
this is more flexible since you can't do with the current system:
for (int a = 0, char b = 'a'; ; ) {...}
because "int a = 0" is a declaration and not an expression.
with tuples:
for (auto t = (0, 'a'); ; ) {...}
More information about the Digitalmars-d
mailing list