On 12/09/2011 10:19 AM, Don wrote:
On 08.12.2011 20:22, Timon Gehr wrote:
On 12/08/2011 05:02 PM, Regan Heath wrote:
On Thu, 08 Dec 2011 12:17:20 -0000, so <s...@so.so> wrote:

On Thu, 08 Dec 2011 11:17:48 +0200, Dejan Lekic
<dejan.le...@gmail.com> wrote:



Why is this operator still kept around?

No offense, but I find it strange/funny that you even ask why! :)

Have you never used comma in for loops???


Not sure if it is that relevant for D, but good point.

for(auto i=beg(), e=end(); i!=e; ++i)
for(auto i, j, k;; ++i, ++k)
...

It's kinda amusing that this thread appeared just as we had a case of
this here at work. The developer accidentally coded something like...

if (function(..), FALSE)
{
}

Accidentally adding the ", FALSE" /after/ the ) instead of as a new
parameter to the function.

(note; This was in C++ with default parameter values so the function can
in fact take 1-4 args).

When I pointed this out, he said "how does that even compile" and was
completely unaware of the existence of the comma operator, nor (once I
explained it) did he realise it was in any way related to the comma used
in for loops. People simply don't think of them as being the same thing
at all. Instead, people learn the comma syntax as a special
characteristic of the for loop, and use it nowhere else.

I think the comma operator is of little benefit (except where used in a
for loop) and it is a source of bugs and we'd be better off without it.
Even if it means porting C/C++ requires modification, or existing D (I
doubt very much of it) breaks.


Phobos would break, for example. And some of my code too.

Are there any cases where you're using comma outside of for loops?

Yes, one for every 65 LOC.

I wonder how much would break if were made illegal everywhere else.

These are the occurences of the comma operator in directory 'std':

return r2.empty ? (r1 = r, true) : false;
return binaryFun!pred(r.front, e) ? (r.popFront(), true) : false;

if (f.flPlus)
    signChar = '+', ++minw;
else if (f.flSpace)
    signChar = ' ', ++minw;

if (std.ascii.toLower(p.front) == 'n' &&
       (p.popFront(), std.ascii.toLower(p.front) == 'f') &&
       (p.popFront(), p.empty))

enforce((p.popFront(), !p.empty && std.ascii.toUpper(p.front) == 'A')
        && (p.popFront(), !p.empty && std.ascii.toUpper(p.front) == 'N'),
       new ConvException("error converting input to floating point"));

if (indexStart != 0)
    formatValue(w, indexStart, f), put(w, '$');

if (c == '\"' || c == '\\')
    put(w, '\\'), put(w, c);
else
    put(w, c);

return (++mi.m_cRefs, cast(HXModule)mi);
return (++mi.m_cRefs, hModule);

return
    c <= 0x7F ? 1
    : c <= 0x7FF ? 2
    : c <= 0xFFFF ? 3
    : c <= 0x10FFFF ? 4
    : (assert(false), 6);





Reply via email to