[Language construct idea] The for loop with prepare step
Quirin Schroll
qs.il.paperinik at gmail.com
Tue Feb 13 11:39:56 UTC 2024
On Tuesday, 13 February 2024 at 00:59:36 UTC, Richard (Rikki)
Andrew Cattermole wrote:
>
> On 13/02/2024 6:52 AM, H. S. Teoh wrote:
>> One example of the usefulness of a loop construct that
>> supports the above construct in full generality is the
>> outputing of list delimiters. If we postulate a syntax
>> construct like:
>>
>>
>> |loop { loopBodyBeforeCondition(); } while(cond) {
>> loopBodyAfterCondition(); } |
>>
>>
>> then, given some range r of items, we can output it with
>> delimiters like this:
>>
>>
>> |loop { writef("%s", r.front); r.popFront; } while(!r.empty) {
>> write(", "); } |
>
> Oh I quite like this.
Me, too. I love this:
```d
do
{
…
}
while (cond)
{
…
}
```
It’s a lot more structured than:
```d
for (;;)
{
…
if (!cond) break;
…
}
```
The only issue I see is it would probably be useful to have the
variables declared in the top part be in scope in the lower part,
however that is counterintuitive because of separated blocks. The
less structured construct solves this.
In my 4-statement `for` loop, it’s not surprising that a variable
declared in the prepare step is present in the loop body.
Alternatively, one can double-down on D’s for loop weirdness and
allow this:
```d
for ({int i = 1; int n = 10;} i < n; ++i) { } // already possible
for (int i = 0; {int n = 10 - i; i < n;} ++i) { } // new!
```
Thinking about it, I actually like that more. The small semicolon
could really easily be missed, while the braces are striking.
I know I’ve seen this in some diagrams at university. Probably
some form of Nassi–Shneiderman diagram. The University of
Darmstadt has one here:
https://www.iim.maschinenbau.tu-darmstadt.de/kursunterlagen_archiv/pst_ws1314/04-Methoden-3/Theorie/nassishneidermann.html (German) Image only:https://www.iim.maschinenbau.tu-darmstadt.de/kursunterlagen_archiv/pst_ws1314/04-Methoden-3/Theorie/endlosschleife.png
On the other hand, this is rather obscure and I don’t intuit how
it’ll work:
```d
foreach(x; xs)
{
…
}
while
{
…
}
```
This is my attempt to express it in terms of a `while` loop and
range primitives:
```d
for (;;)
{
…
if (!xs.empty) break;
auto x = xs.front;
…
xs.popFront;
}
```
It’s weird to do stuff before you check a range for empty. It’s
fine explicitly, but it would be weird to have `x` not be there
in the first block after `foreach`.
Correct me if I got the lowering wrong.
More information about the Digitalmars-d
mailing list