www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.learn - Make foreach element optional

reply Per =?UTF-8?B?Tm9yZGzDtnc=?= <per.nordlow gmail.com> writes:
I find myself writing

foreach (_; 0 .. n)
     doSomething(); // no using the variable `_`

.

What about relaxing the syntax to allow

     foreach (; 0 .. n)

and/or

     foreach (0 .. n)

?

Thereby making the `ForeachTypeList` of `AggregateForeach` in the 
grammar rule [1] optional.

[1] https://dlang.org/spec/statement.html#foreach-statement
Mar 16
next sibling parent reply Imperatorn <johan_forsberg_86 hotmail.com> writes:
On Tuesday, 16 March 2021 at 12:49:13 UTC, Per Nordlöw wrote:
 I find myself writing

 foreach (_; 0 .. n)
     doSomething(); // no using the variable `_`

 .

 What about relaxing the syntax to allow

     foreach (; 0 .. n)

 and/or

     foreach (0 .. n)

 ?

 Thereby making the `ForeachTypeList` of `AggregateForeach` in 
 the grammar rule [1] optional.

 [1] https://dlang.org/spec/statement.html#foreach-statement
foreach(0..n) could work. Why though.
Mar 16
parent reply Per =?UTF-8?B?Tm9yZGzDtnc=?= <per.nordlow gmail.com> writes:
On Tuesday, 16 March 2021 at 13:31:34 UTC, Imperatorn wrote:
 foreach(0..n) could work. Why though.
When performing a side-effect n times.
Mar 16
parent reply Imperatorn <johan_forsberg_86 hotmail.com> writes:
On Tuesday, 16 March 2021 at 13:52:29 UTC, Per Nordlöw wrote:
 On Tuesday, 16 March 2021 at 13:31:34 UTC, Imperatorn wrote:
 foreach(0..n) could work. Why though.
When performing a side-effect n times.
Then why not just do: auto times(alias F, T)(T number) {    return number.iota.each!(_ => F()); } void f() {    writeln("hi"); } n.times!(f); ?
Mar 16
parent bachmeier <no spam.net> writes:
On Tuesday, 16 March 2021 at 16:29:45 UTC, Imperatorn wrote:
 On Tuesday, 16 March 2021 at 13:52:29 UTC, Per Nordlöw wrote:
 On Tuesday, 16 March 2021 at 13:31:34 UTC, Imperatorn wrote:
 foreach(0..n) could work. Why though.
When performing a side-effect n times.
Then why not just do: auto times(alias F, T)(T number) {    return number.iota.each!(_ => F()); } void f() {    writeln("hi"); } n.times!(f); ?
To my knowledge, there's nothing like this in the standard library or the language. I used something similar but eventually decided it was simpler to use the original foreach. It'd honestly have to be a language change to be useful. (Given the benefit, I doubt this would happen.)
Mar 16
prev sibling next sibling parent reply Steven Schveighoffer <schveiguy gmail.com> writes:
On 3/16/21 8:49 AM, Per Nordlöw wrote:
 I find myself writing
 
 foreach (_; 0 .. n)
      doSomething(); // no using the variable `_`
 
 .
 
 What about relaxing the syntax to allow
 
      foreach (; 0 .. n)
 
 and/or
 
      foreach (0 .. n)
 
 ?
 
 Thereby making the `ForeachTypeList` of `AggregateForeach` in the 
 grammar rule [1] optional.
 
 [1] https://dlang.org/spec/statement.html#foreach-statement
Meh, is this a common need though? The first form isn't terrible. In general, I'd say it would be nice to designate _ as an unused variable (i.e. not allowed to access it, and it doesn't trigger shadowing errors). It's like this in Swift for instance. -Steve
Mar 16
parent Jack <jckj33 gmail.com> writes:
On Tuesday, 16 March 2021 at 15:02:54 UTC, Steven Schveighoffer 
wrote:
 On 3/16/21 8:49 AM, Per Nordlöw wrote:
 I find myself writing
 
 foreach (_; 0 .. n)
      doSomething(); // no using the variable `_`
 
 .
 
 What about relaxing the syntax to allow
 
      foreach (; 0 .. n)
 
 and/or
 
      foreach (0 .. n)
 
 ?
 
 Thereby making the `ForeachTypeList` of `AggregateForeach` in 
 the grammar rule [1] optional.
 
 [1] https://dlang.org/spec/statement.html#foreach-statement
Meh, is this a common need though? The first form isn't terrible. In general, I'd say it would be nice to designate _ as an unused variable (i.e. not allowed to access it, and it doesn't trigger shadowing errors). It's like this in Swift for instance. -Steve
the _ as unused variable would be useful when the parameter has this currently. int foo(int x, out bool state) { } // only wants return value int y = foo(x, _);
Mar 16
prev sibling parent bachmeier <no spam.net> writes:
On Tuesday, 16 March 2021 at 12:49:13 UTC, Per Nordlöw wrote:
 I find myself writing

 foreach (_; 0 .. n)
     doSomething(); // no using the variable `_`

 .

 What about relaxing the syntax to allow

     foreach (; 0 .. n)

 and/or

     foreach (0 .. n)

 ?

 Thereby making the `ForeachTypeList` of `AggregateForeach` in 
 the grammar rule [1] optional.

 [1] https://dlang.org/spec/statement.html#foreach-statement
The gain to altering the foreach statement is minimal since _ is a nice convention to use if you don't need the value of the counter. Something like this gives cleaner code: replicate(100) { // do stuff with side effects } I don't know if it would be an opportunity for a compiler optimization (probably not).
Mar 16