std.algorithm missing for_each?

Jakob Ovrum jakobovrum at gmail.com
Wed Feb 5 03:40:10 PST 2014


On Wednesday, 5 February 2014 at 10:03:52 UTC, Jens Mueller wrote:
> Dear lovely D community,
>
> recently I refactored some code into component style (see 
> Component
> Programming in D by Walter
> http://www.drdobbs.com/architecture-and-design/component-programming-in-d/240008321)
>
> It looks about like this
>
> someInputRange
> .filter!()
> .map!()
>
> Next I want to discard all elements but perform some last 
> operation on
> each element. The problem is that map forces me to pass a 
> function that
> returns. Of course I could return a fake value. But that 
> doesn't look
> proper. Another option is to iterate using the foreach loop. 
> Does not
> look better either, does it?
>
> This makes me believe that std.algorithm misses an algorithm. 
> The
> for_each algorithm (see for_each in STL
> http://www.cplusplus.com/reference/algorithm/for_each/).
>
> To rephrase the problem more general (because maybe I'm just 
> not seeing
> how to fit the pieces together): How do you perform some 
> arbitrary
> operation on the elements of a range?
>
> myRange
> .each!((e)
> {
> 	e.someOperation();
> });
>
> Jens

Consuming an input range in the functional style should be done 
by std.algorithm.copy (passing an output range) or by simply 
passing the input range to the consumer algorithm.

Sometimes this isn't possible, which means reverting to foreach, 
i.e. a mix of functional and imperative style. This is the 
equivalent of STL's `for_each`.

I think adding an `each` function to Phobos is problematic. It is 
syntax sugar for foreach, but with the downside of obfuscating 
what is essentially imperative code. IMO, imperative code should 
look like imperative code, which with foreach is by no means ugly.


More information about the Digitalmars-d mailing list