Re: OT: for (;;) {} vs while (true) {}

2016-12-01 Thread Jonathan M Davis via Digitalmars-d
On Thursday, December 01, 2016 19:25:27 Meta via Digitalmars-d wrote:
> On Friday, 25 November 2016 at 15:29:31 UTC, Adam D. Ruppe wrote:
> > On Friday, 25 November 2016 at 15:03:26 UTC, Andrei
> >
> > Alexandrescu wrote:
> >> We need to change the range API then. -- Andrei
> >
> > That's absurd, popFront is in no way semantically a property,
> > so it should not get @property.
> >
> > It has been so many years of this being poorly defined. Let's
> > just close the book and officially put the status quo on
> > optional parenthesis in stone: they are optional on
> > zero-argument calls, regardless of @property, and that isn't
> > going to change.
> >
> > Then this popFront question becomes moot.
>
> This causes a world of pain when you want to pass functions
> around. Nothing gets my blood pressure up like the following code:
>
> https://forum.dlang.org/post/piktfrtpltmjvjmed...@forum.dlang.org

I think that having optional parens in D was a mistake, and your situation
there is an example of why it can be a big problem (the problems caused by
being lax with syntax in generic code is another). However, the shipped has
long since sailed on that one. It's too popular and too widely used to
change at this point. And while I completely agree that allowing optional
parens causes problems, it's also true that a lot of code is able to use it
without difficulties, and many folks like it, particularly when they have to
use parens for template arguments in UFCS call chains.

- Jonathan M Davis



Re: OT: for (;;) {} vs while (true) {}

2016-12-01 Thread Meta via Digitalmars-d

On Friday, 25 November 2016 at 15:29:31 UTC, Adam D. Ruppe wrote:
On Friday, 25 November 2016 at 15:03:26 UTC, Andrei 
Alexandrescu wrote:

We need to change the range API then. -- Andrei


That's absurd, popFront is in no way semantically a property, 
so it should not get @property.


It has been so many years of this being poorly defined. Let's 
just close the book and officially put the status quo on 
optional parenthesis in stone: they are optional on 
zero-argument calls, regardless of @property, and that isn't 
going to change.


Then this popFront question becomes moot.


This causes a world of pain when you want to pass functions 
around. Nothing gets my blood pressure up like the following code:


https://forum.dlang.org/post/piktfrtpltmjvjmed...@forum.dlang.org


Re: OT: for (;;) {} vs while (true) {}

2016-12-01 Thread H. S. Teoh via Digitalmars-d
On Thu, Dec 01, 2016 at 11:23:26AM -0500, Nick Sabalausky via Digitalmars-d 
wrote:
> On 11/24/2016 05:09 PM, Dennis Ritchie wrote:
[...]
> > The next question is:
> > What principles guided when choosing between `for (;;) { ... }` and
> > `while (true) { ... }` ?
> 
> Personal preference. Nothing more. Programmers have far better things
> to do that fret over the relative merits of two identical constructs
> that have no relative (de)merits over each other.

Far better things?  You mean, like having endless discussions about a
controversial D topic on this forum while procrastinating on the actual
writing of code?  Yeah, I can see that.  :-P


T

-- 
It is of the new things that men tire --- of fashions and proposals and 
improvements and change. It is the old things that startle and intoxicate. It 
is the old things that are young. -- G.K. Chesterton


Re: OT: for (;;) {} vs while (true) {}

2016-12-01 Thread Nick Sabalausky via Digitalmars-d

On 11/24/2016 05:09 PM, Dennis Ritchie wrote:

On Thursday, 24 November 2016 at 22:04:00 UTC, LiNbO3 wrote:

As you can see [1] the `while (true)` is lowered into `for (;true;)`
so it's all about what construct pleases you the most.

[1]
https://github.com/dlang/dmd/blob/cd451ceae40d04f7371e46df1c955fd914f3085f/src/statementsem.d#L357



OK, thanks.

The next question is:
What principles guided when choosing between `for (;;) { ... }` and
`while (true) { ... }` ?


Personal preference. Nothing more. Programmers have far better things to 
do that fret over the relative merits of two identical constructs that 
have no relative (de)merits over each other.




Re: OT: for (;;) {} vs while (true) {}

2016-11-25 Thread Timon Gehr via Digitalmars-d

On 25.11.2016 17:38, Kagamin wrote:

On Friday, 25 November 2016 at 11:10:44 UTC, Timon Gehr wrote:

You can just as easily edit the while condition. I use it because
"unconditional loop" is less silly than "loop until true is false".


Unconditional loop can be implemented in 3 possible ways :)
1. skip it entirely: since there's no condition to check, can't decide
if should enter at all
2. run once: since there's no condition to check, can't decide if should
repeat - becomes just an unconditional block statement
3. infinite loop as if the condition is always true - until it's false


Grab a dictionary.


Re: OT: for (;;) {} vs while (true) {}

2016-11-25 Thread Dennis Ritchie via Digitalmars-d
I don't mean an infinite loop for (;;), and violation of the 
concepts of structured programming, which put forward Dijkstra.


for (;;) {
...
if (condition) {
break;
}
...
}

outer: for (;;) {
...
if (condition) {
goto outer;
}
...
}

I.e. in system programming and I want to use `break` or `goto`, 
because here we use imperative rather than declarative approach.
The following question arises. Are structured programming concept 
of Dijkstra's right for writing system software?


Re: OT: for (;;) {} vs while (true) {}

2016-11-25 Thread Jonathan M Davis via Digitalmars-d
On Friday, November 25, 2016 11:51:24 Andrei Alexandrescu via Digitalmars-d 
wrote:
> Jonathan, could you please make a PR to remove the parens. Thanks.

Done.

https://github.com/dlang/phobos/pull/4925

- Jonathan M Davis



Re: OT: for (;;) {} vs while (true) {}

2016-11-25 Thread H. S. Teoh via Digitalmars-d
On Fri, Nov 25, 2016 at 03:20:24AM -0800, Jonathan M Davis via Digitalmars-d 
wrote:
> On Friday, November 25, 2016 12:10:44 Timon Gehr via Digitalmars-d wrote:
> > On 25.11.2016 11:33, Claude wrote:
> > > ...
> > >
> > > Between "for(;;)", "while(true)" and "do while(true)", I would use the
> > > "while (true) { }" for pure readability and semantic reasons.
> > > ...
> >
> > What semantic reasons?
> 
> Probably the complete lack of a condition to test in for(;;). I
> confess that I was shocked when I found out that it was legal to have
> a for loop without a condition. That seems like doing while() or if(),
> which makes no sense.

Sure it does. A conditionless loop is exactly what an infinite loop is.
A while-loop, by definition, has a condition (loop *while* something is
true, stop looping when it's no longer true), and an if-statement by
definition is conditional. Neither match the nature of an infinite loop,
which is infinite because it has no exit condition.

Well, OK, a loop can also be infinite if the exit condition just happens
to be always true, but I feel that is more deceptive than a
conditionless loop when it's deliberately written, since a conditional
loop whose condition happens to be always true sounds to me like a bug
or a subversion (we intend this loop to stop when condition X becomes
false, but bwahaha I arranged for X to never become false!). When a loop
is *deliberately* meant to be infinite, I see a conditionless loop as a
more faithful representation of that intent.

Therefore I prefer `for(;;)` over any of the `while(true)`, `while(1)`,
etc., variations. It conveys intent in a more straightforward, up-front
way.

If it helps you stomach it, you could interpret the `(;;)` as a funny
way of saying "ever", so in essence you're saying `for-ever { ... }`.


T

-- 
Computers shouldn't beep through the keyhole.


Re: OT: for (;;) {} vs while (true) {}

2016-11-25 Thread Steven Schveighoffer via Digitalmars-d

On 11/25/16 11:47 AM, Jonathan M Davis via Digitalmars-d wrote:

On Friday, November 25, 2016 10:46:15 Steven Schveighoffer via Digitalmars-d
wrote:

On 11/25/16 8:24 AM, Jonathan M Davis via Digitalmars-d wrote:



I would point out that technically, that breaks the range API.
isInputRange requires that popFront be callable with parens, but it
does not require that it be callable without parens. So, someone could
define popFront as a public member variable with an overloaded opCall.
That would not compile if it were used with code that called popFront
without parens even though it would compile with isInputRange.


This is a misunderstanding. The missing parens is for *usage* of the
range, not *definition* of the range. It won't affect isInputRange at all.


It's not a misunderstanding.

template isInputRange(R)
{
enum bool isInputRange = is(typeof(
(inout int = 0)
{
R r = R.init; // can define a range object
if (r.empty) {}   // can test for empty
r.popFront(); // can invoke popFront()
auto h = r.front; // can get the front of the range
}));
}

calls popFront with parens. That means that it's perfectly legal per
isInputRange to define popFront such that it's a callable that does _not_
work with optional parens. So, if it were a member variable that defined
opCall or was a delegate, then to use it, the parens are required. That
means that I could define a range that passes isInputRange but does not work
with code that called popFront without parens. As isInputRange is currently
defined, it's perfectly legal.


It's perfectly legal to make a popFront that destroys your entire 
program. Or that doesn't actually pop the front (see old generate() 
function). So what? I can't see the point of going out of your way to 
make a popFront member that supports opCall, when you can use a function.


Note: there are cases out there where popFront is called without 
parentheses. It has never broken any code. This should be a hint that 
what you are concerned about doesn't happen in practice.


-Steve


Re: OT: for (;;) {} vs while (true) {}

2016-11-25 Thread Kagamin via Digitalmars-d
On Friday, 25 November 2016 at 15:46:15 UTC, Steven Schveighoffer 
wrote:
This case you have of defining a popFront member variable with 
opCall -- don't do that, it will break things (I'm sure there 
are already many places where popFront is called without 
parens). I don't think that's a case that we need worry about.


Seems like not that many.
grep -r "popFront;" *
algorithm/comparison.d:r2.popFront;
algorithm/comparison.d:r1.popFront;
algorithm/comparison.d:   r1.popFront;
algorithm/comparison.d:   r2.popFront;
algorithm/mutation.d:void popFront() { data.popFront; }
experimental/allocator/typed.d:front, popFront;
experimental/ndslice/selection.d:
val.popFront;

experimental/ndslice/selection.d:elems2.popFront;
experimental/ndslice/selection.d:elems2.popFront;
experimental/ndslice/selection.d:elems.popFront;
experimental/ndslice/slice.d:slice.popFront;
experimental/ndslice/slice.d:slice.popFront;
experimental/ndslice/slice.d:value.popFront;
experimental/ndslice/slice.d:slice.popFront;
experimental/ndslice/slice.d:value.popFront;
experimental/ndslice/slice.d:slice.popFront;
experimental/ndslice/slice.d:slice.popFront;
experimental/ndslice/slice.d:slice.popFront;
experimental/ndslice/slice.d:slice.popFront;
experimental/ndslice/slice.d:slice.popFront;
experimental/ndslice/slice.d:slice.popFront;
range/package.d:return condition ? r1.popFront : 
r2.popFront;


The last one is strange.


Re: OT: for (;;) {} vs while (true) {}

2016-11-25 Thread Jonathan M Davis via Digitalmars-d
On Friday, November 25, 2016 11:01:56 Andrei Alexandrescu via Digitalmars-d 
wrote:
> On 11/25/16 10:29 AM, Adam D. Ruppe wrote:
> > Let's just close the book and officially put the status quo on optional
> > parenthesis in stone: they are optional on zero-argument calls,
> > regardless of @property, and that isn't going to change.
>
> Agreed. -- Andrei

That's fine, but it doesn't help any when the callable can't be used with
optional parens - which is the case with a type overloading opCall as well
as function pointers and delegates. And the real problem here isn't whether
someone chooses to call a function with parens or not in some chunk of their
code. The problem is whether _generic_ code does it. If you're calling
something with parens in generic code, then you need to be able to rely on
it working with parens regardless of the types of the function arguments.
And if you're calling it without parens, then you need to be able to rely on
it working _without_ parens regardless of the types of the function
arguments.

Stuff like empty, save, and length in the range API all of the same problem
as popFront and popBack except in reverse. In their case, they need to be
called without parens, or the code won't work with some ranges (the most
obvious case being for empty being infinite ranges, and the most obvious
case for length being dynamic arrays).

So, restricting popFront and popBack to being functions so that they can
always be called without parens is fine, but it's still the case that you
can't be completely lax with where you do or don't use parens in generic
code.

- Jonathan M Davis



Re: OT: for (;;) {} vs while (true) {}

2016-11-25 Thread Andrei Alexandrescu via Digitalmars-d

On 11/25/2016 11:47 AM, Jonathan M Davis via Digitalmars-d wrote:

template isInputRange(R)
{
enum bool isInputRange = is(typeof(
(inout int = 0)
{
R r = R.init; // can define a range object
if (r.empty) {}   // can test for empty
r.popFront(); // can invoke popFront()
auto h = r.front; // can get the front of the range
}));
}

calls popFront with parens.


Jonathan, could you please make a PR to remove the parens. Thanks. -- Andrei


Re: OT: for (;;) {} vs while (true) {}

2016-11-25 Thread Jonathan M Davis via Digitalmars-d
On Friday, November 25, 2016 10:03:26 Andrei Alexandrescu via Digitalmars-d 
wrote:
> On 11/25/16 8:24 AM, Jonathan M Davis via Digitalmars-d wrote:
> > I would point out that technically, that breaks the range API.
>
> We need to change the range API then. -- Andrei

We can certainly do that. I'm just pointing out that as it stands, it's
legal to declare popFront to be a callable that doesn't work with optional
parens, and as long as that's true, calling popFront without parens means
that the code won't work with perfectly legitimate ranges. So, unless/until
isInputRange is changed, I'd say that calling popFront without parens is a
bad idea.

- Jonathan M Davis



Re: OT: for (;;) {} vs while (true) {}

2016-11-25 Thread Jonathan M Davis via Digitalmars-d
On Friday, November 25, 2016 10:46:15 Steven Schveighoffer via Digitalmars-d 
wrote:
> On 11/25/16 8:24 AM, Jonathan M Davis via Digitalmars-d wrote:
> > On Friday, November 25, 2016 07:59:07 Andrei Alexandrescu via
> > Digitalmars-d>
> > wrote:
> >> On 11/25/2016 07:53 AM, Dennis Ritchie wrote:
> >>> https://github.com/dlang/phobos/blob/master/std/algorithm/comparison.d
> >>> #L
> >>> 591
> >>
> >> I like that function. If I were to review it now, I'd approve with
> >> these
> >> nits:
> >>
> >> * drop the parens for popFront
> >
> > I would point out that technically, that breaks the range API.
> > isInputRange requires that popFront be callable with parens, but it
> > does not require that it be callable without parens. So, someone could
> > define popFront as a public member variable with an overloaded opCall.
> > That would not compile if it were used with code that called popFront
> > without parens even though it would compile with isInputRange.
>
> This is a misunderstanding. The missing parens is for *usage* of the
> range, not *definition* of the range. It won't affect isInputRange at all.

It's not a misunderstanding.

template isInputRange(R)
{
enum bool isInputRange = is(typeof(
(inout int = 0)
{
R r = R.init; // can define a range object
if (r.empty) {}   // can test for empty
r.popFront(); // can invoke popFront()
auto h = r.front; // can get the front of the range
}));
}

calls popFront with parens. That means that it's perfectly legal per
isInputRange to define popFront such that it's a callable that does _not_
work with optional parens. So, if it were a member variable that defined
opCall or was a delegate, then to use it, the parens are required. That
means that I could define a range that passes isInputRange but does not work
with code that called popFront without parens. As isInputRange is currently
defined, it's perfectly legal.

> This case you have of defining a popFront member variable with opCall --
> don't do that, it will break things (I'm sure there are already many
> places where popFront is called without parens). I don't think that's a
> case that we need worry about.

It's a case that's currently legal. It's just not one that's particularly
likely.  We can certainly change isInputRange to make such a case illegal.
But as it stands, someone could have defined such a range, and it would work
with a _lot_ range-based code, because it's very common to call popFront
with parens, and if such a range were being used with a function in Phobos,
and that function were changed to call popFront without parens, it would
break code.

So, if we want to change the definition of isInputRange to get rid of this
problem, fine. I'm just pointing out that as isInputRange is currently
defined, calling popFront without parens would result in that code not
working with ranges that are perfectly legal per isInputRange and could be
perfectly legitimate ranges in all aspects of how they function.

And calling empty _with_ parens even though it would be legal in most cases
right now would have the exact same problem except in reverse. Everything
wasn't a callable wouldn't work - including stuff like empty on infinite
ranges.

D allows us to be lax with syntax to some extent, but we need to be careful
with how we deal with that in generic code, or we're going to end up with
stuff that should work but doesn't just because parens happened to have been
used or not in a particular piece of code.

- Jonathan M Davis



Re: OT: for (;;) {} vs while (true) {}

2016-11-25 Thread Kagamin via Digitalmars-d

On Friday, 25 November 2016 at 11:10:44 UTC, Timon Gehr wrote:
You can just as easily edit the while condition. I use it 
because "unconditional loop" is less silly than "loop until 
true is false".


Unconditional loop can be implemented in 3 possible ways :)
1. skip it entirely: since there's no condition to check, can't 
decide if should enter at all
2. run once: since there's no condition to check, can't decide if 
should repeat - becomes just an unconditional block statement
3. infinite loop as if the condition is always true - until it's 
false


Re: OT: for (;;) {} vs while (true) {}

2016-11-25 Thread Andrei Alexandrescu via Digitalmars-d

On 11/25/16 10:29 AM, Adam D. Ruppe wrote:

Let's just close the book and officially put the status quo on optional
parenthesis in stone: they are optional on zero-argument calls,
regardless of @property, and that isn't going to change.


Agreed. -- Andrei


Re: OT: for (;;) {} vs while (true) {}

2016-11-25 Thread Steven Schveighoffer via Digitalmars-d

On 11/25/16 8:24 AM, Jonathan M Davis via Digitalmars-d wrote:

On Friday, November 25, 2016 07:59:07 Andrei Alexandrescu via Digitalmars-d
wrote:

On 11/25/2016 07:53 AM, Dennis Ritchie wrote:

https://github.com/dlang/phobos/blob/master/std/algorithm/comparison.d#L
591

I like that function. If I were to review it now, I'd approve with these
nits:

* drop the parens for popFront


I would point out that technically, that breaks the range API. isInputRange
requires that popFront be callable with parens, but it does not require that
it be callable without parens. So, someone could define popFront as a public
member variable with an overloaded opCall. That would not compile if it were
used with code that called popFront without parens even though it would
compile with isInputRange.


This is a misunderstanding. The missing parens is for *usage* of the 
range, not *definition* of the range. It won't affect isInputRange at all.


This case you have of defining a popFront member variable with opCall -- 
don't do that, it will break things (I'm sure there are already many 
places where popFront is called without parens). I don't think that's a 
case that we need worry about.


-Steve.


Re: OT: for (;;) {} vs while (true) {}

2016-11-25 Thread Adam D. Ruppe via Digitalmars-d
On Friday, 25 November 2016 at 15:03:26 UTC, Andrei Alexandrescu 
wrote:

We need to change the range API then. -- Andrei


That's absurd, popFront is in no way semantically a property, so 
it should not get @property.


It has been so many years of this being poorly defined. Let's 
just close the book and officially put the status quo on optional 
parenthesis in stone: they are optional on zero-argument calls, 
regardless of @property, and that isn't going to change.


Then this popFront question becomes moot.


Re: OT: for (;;) {} vs while (true) {}

2016-11-25 Thread Andrei Alexandrescu via Digitalmars-d

On 11/25/16 8:24 AM, Jonathan M Davis via Digitalmars-d wrote:

I would point out that technically, that breaks the range API.


We need to change the range API then. -- Andrei


Re: OT: for (;;) {} vs while (true) {}

2016-11-25 Thread Jonathan M Davis via Digitalmars-d
On Friday, November 25, 2016 07:59:07 Andrei Alexandrescu via Digitalmars-d 
wrote:
> On 11/25/2016 07:53 AM, Dennis Ritchie wrote:
> > https://github.com/dlang/phobos/blob/master/std/algorithm/comparison.d#L
> > 591
> I like that function. If I were to review it now, I'd approve with these
> nits:
>
> * drop the parens for popFront

I would point out that technically, that breaks the range API. isInputRange
requires that popFront be callable with parens, but it does not require that
it be callable without parens. So, someone could define popFront as a public
member variable with an overloaded opCall. That would not compile if it were
used with code that called popFront without parens even though it would
compile with isInputRange.

Now, realistically, no one is going to do that, so it probably doesn't
matter. But it seems to me that in general, when dealing with a trait like
isInputRange which tests that a particular syntax is used, it's just safer
to use that syntax rather than using parens where it doesn't or not using
parens where it does.

- Jonathan M Davis



Re: OT: for (;;) {} vs while (true) {}

2016-11-25 Thread Dennis Ritchie via Digitalmars-d
On Friday, 25 November 2016 at 12:59:07 UTC, Andrei Alexandrescu 
wrote:
i.e. it's not relevant to users that the string version has a 
distinct implementation.


In fact I suggest someone implements this.


The problem is not the users, and the places where you will use 
your program. Because this code is easy to make a mistake that 
can lead to failure in the automated system.

Unfortunately, writing such code is not safe.


Re: OT: for (;;) {} vs while (true) {}

2016-11-25 Thread Andrei Alexandrescu via Digitalmars-d

On 11/25/2016 07:53 AM, Dennis Ritchie wrote:

On Friday, 25 November 2016 at 11:20:24 UTC, Jonathan M Davis wrote:

Probably the complete lack of a condition to test in for(;;). I
confess that I was shocked when I found out that it was legal to have
a for loop without a condition. That seems like doing while() or if(),
which makes no sense. So, I never use for(;;) and wish that it didn't
exist, but it does, and some folks use it. So, I have to live with the
possiblity of dealing with it when dealing with code written by other
people. But I won't ever use it.


IMO, it is very convenient for system programming guru. It is believed
that it came from the K

For example, this option is definitely very convenient to use:
https://github.com/dlang/phobos/blob/master/std/algorithm/comparison.d#L591


I like that function. If I were to review it now, I'd approve with these 
nits:


* drop the parens for popFront

* s/-cast(int)!r2.empty/-int(!r2.empty)/

* Merge with the cmp implementation for strings and simplify the 
constraint from


if (isInputRange!R1 && isInputRange!R2 && !(isSomeString!R1 && 
isSomeString!R2))


to

if (isInputRange!R1 && isInputRange!R2)

i.e. it's not relevant to users that the string version has a distinct 
implementation.


In fact I suggest someone implements this.


Andrei



Re: OT: for (;;) {} vs while (true) {}

2016-11-25 Thread Dennis Ritchie via Digitalmars-d
On Friday, 25 November 2016 at 11:20:24 UTC, Jonathan M Davis 
wrote:
Probably the complete lack of a condition to test in for(;;). I 
confess that I was shocked when I found out that it was legal 
to have a for loop without a condition. That seems like doing 
while() or if(), which makes no sense. So, I never use for(;;) 
and wish that it didn't exist, but it does, and some folks use 
it. So, I have to live with the possiblity of dealing with it 
when dealing with code written by other people. But I won't 
ever use it.


IMO, it is very convenient for system programming guru. It is 
believed that it came from the K


For example, this option is definitely very convenient to use:
https://github.com/dlang/phobos/blob/master/std/algorithm/comparison.d#L591


Re: OT: for (;;) {} vs while (true) {}

2016-11-25 Thread Claude via Digitalmars-d

Sorry, I sent my post before finishing it, so...

It's in same vein as using:

if (cond)
{
  singleStatement;
}

instead of:

if (cond)
  singleStatement;

Because, you can more easily insert statements within the block 
(without having to navigate to different to insert the brackets).




Re: OT: for (;;) {} vs while (true) {}

2016-11-25 Thread Claude via Digitalmars-d

On Friday, 25 November 2016 at 11:10:44 UTC, Timon Gehr wrote:

On 25.11.2016 11:33, Claude wrote:

...

Between "for(;;)", "while(true)" and "do while(true)", I would 
use the

"while (true) { }" for pure readability and semantic reasons.
...


What semantic reasons?


In the general sense:

- While true (is always true), I loop.

Is more meaningful and conceptually easy then the empty for 
statement :


- For "empty initialization statement" until "I don't know (so 
forever by default)" and "not iterating", I loop.


I reckon "for(;;)" form is used for debug reasons (so you can 
easily
insert conditions to transform an infinite loop into a finite 
one).


You can just as easily edit the while condition. I use it 
because "unconditional loop" is less silly than "loop until 
true is false".


I was just trying to explain why one would use for(;;) instead of 
while(true), you've got only one line to edit.


It's in same vein as using:

if (cond)
{

}


Re: OT: for (;;) {} vs while (true) {}

2016-11-25 Thread Jonathan M Davis via Digitalmars-d
On Friday, November 25, 2016 12:10:44 Timon Gehr via Digitalmars-d wrote:
> On 25.11.2016 11:33, Claude wrote:
> > ...
> >
> > Between "for(;;)", "while(true)" and "do while(true)", I would use the
> > "while (true) { }" for pure readability and semantic reasons.
> > ...
>
> What semantic reasons?

Probably the complete lack of a condition to test in for(;;). I confess that
I was shocked when I found out that it was legal to have a for loop without
a condition. That seems like doing while() or if(), which makes no sense.
So, I never use for(;;) and wish that it didn't exist, but it does, and some
folks use it. So, I have to live with the possiblity of dealing with it when
dealing with code written by other people. But I won't ever use it.

- Jonathan M Davis



Re: OT: for (;;) {} vs while (true) {}

2016-11-25 Thread Timon Gehr via Digitalmars-d

On 25.11.2016 11:33, Claude wrote:

...

Between "for(;;)", "while(true)" and "do while(true)", I would use the
"while (true) { }" for pure readability and semantic reasons.
...


What semantic reasons?


I reckon "for(;;)" form is used for debug reasons (so you can easily
insert conditions to transform an infinite loop into a finite one).


You can just as easily edit the while condition. I use it because 
"unconditional loop" is less silly than "loop until true is false".


Re: OT: for (;;) {} vs while (true) {}

2016-11-25 Thread Claude via Digitalmars-d
On Thursday, 24 November 2016 at 22:09:22 UTC, Dennis Ritchie 
wrote:

On Thursday, 24 November 2016 at 22:04:00 UTC, LiNbO3 wrote:
As you can see [1] the `while (true)` is lowered into `for 
(;true;)` so it's all about what construct pleases you the 
most.


[1] 
https://github.com/dlang/dmd/blob/cd451ceae40d04f7371e46df1c955fd914f3085f/src/statementsem.d#L357


OK, thanks.

The next question is:
What principles guided when choosing between `for (;;) { ... }` 
and `while (true) { ... }` ?


For example, there are two options:
https://github.com/dlang/phobos/blob/master/std/algorithm/sorting.d


Between "for(;;)", "while(true)" and "do while(true)", I would 
use the "while (true) { }" for pure readability and semantic 
reasons.


I reckon "for(;;)" form is used for debug reasons (so you can 
easily insert conditions to transform an infinite loop into a 
finite one).


Re: OT: for (;;) {} vs while (true) {}

2016-11-25 Thread Stefan Koch via Digitalmars-d
On Friday, 25 November 2016 at 08:46:24 UTC, rikki cattermole 
wrote:

On 25/11/2016 8:27 PM, unDEFER wrote:

Why you consider only 2 options?
Use "do {} while (true);" :-)


The condition only executes after a single iteration.
So it is not the same code flow.


For an the usecase infinite-loop the code has the same effect.
And will translate to the same machine-code, hopefully.



Re: OT: for (;;) {} vs while (true) {}

2016-11-25 Thread rikki cattermole via Digitalmars-d

On 25/11/2016 8:27 PM, unDEFER wrote:

Why you consider only 2 options?
Use "do {} while (true);" :-)


The condition only executes after a single iteration.
So it is not the same code flow.


Re: OT: for (;;) {} vs while (true) {}

2016-11-24 Thread unDEFER via Digitalmars-d

Why you consider only 2 options?
Use "do {} while (true);" :-)


Re: OT: for (;;) {} vs while (true) {}

2016-11-24 Thread Andrei Alexandrescu via Digitalmars-d

On 11/24/2016 05:09 PM, Dennis Ritchie wrote:

On Thursday, 24 November 2016 at 22:04:00 UTC, LiNbO3 wrote:

As you can see [1] the `while (true)` is lowered into `for (;true;)`
so it's all about what construct pleases you the most.

[1]
https://github.com/dlang/dmd/blob/cd451ceae40d04f7371e46df1c955fd914f3085f/src/statementsem.d#L357



OK, thanks.

The next question is:
What principles guided when choosing between `for (;;) { ... }` and
`while (true) { ... }` ?

For example, there are two options:
https://github.com/dlang/phobos/blob/master/std/algorithm/sorting.d


I wouldn't ding anyone in a code review for using one vs the other. -- 
Andrei


Re: OT: for (;;) {} vs while (true) {}

2016-11-24 Thread Dennis Ritchie via Digitalmars-d

On Thursday, 24 November 2016 at 22:04:00 UTC, LiNbO3 wrote:
As you can see [1] the `while (true)` is lowered into `for 
(;true;)` so it's all about what construct pleases you the most.


[1] 
https://github.com/dlang/dmd/blob/cd451ceae40d04f7371e46df1c955fd914f3085f/src/statementsem.d#L357


OK, thanks.

The next question is:
What principles guided when choosing between `for (;;) { ... }` 
and `while (true) { ... }` ?


For example, there are two options:
https://github.com/dlang/phobos/blob/master/std/algorithm/sorting.d


Re: OT: for (;;) {} vs while (true) {}

2016-11-24 Thread LiNbO3 via Digitalmars-d
On Thursday, 24 November 2016 at 21:57:15 UTC, Dennis Ritchie 
wrote:

Hi all,

In the source code, written in D, is often used in the design 
of the `for (;;) { ... }`


Maybe someone has specific examples of translation of code in 
asm, where `while (true) { ... }` or `for (;;) { ... }` affect 
the performance or cross-platform programs.

It would be interesting to see samples.


As you can see [1] the `while (true)` is lowered into `for 
(;true;)` so it's all about what construct pleases you the most.


[1] 
https://github.com/dlang/dmd/blob/cd451ceae40d04f7371e46df1c955fd914f3085f/src/statementsem.d#L357