foreach thoughts

Manu turkeyman at gmail.com
Tue Jan 14 01:04:06 PST 2014


On 14 January 2014 18:36, Jakob Ovrum <jakobovrum at gmail.com> wrote:

> On Tuesday, 14 January 2014 at 08:23:05 UTC, Manu wrote:
>
>> 1. A termination condition (ie, while)
>>
>> foreach(t; things) iterates each thing, but it's common in traditional for
>> loops to have an && in the second 'while' term, to add an additional
>> termination condition.
>> for(i=0; i<things.length && things[i].someCondition; ++i)
>>
>> Or with foreach:
>> foreach(i, t; things)
>> {
>>   if(t.someCondition)
>>     break;
>>   ...
>> }
>>
>
> foreach(t; things.until!(t => t.someCondition))
> {
> }
>
> Unfortunately foreach over a range does not automatically support an index
> loop variable. We could add something like std.range.enumerate to support
> this, but I think it's a common enough requirement that a language
> amendment is warranted (there are some subtleties involved in implementing
> it though - specifically when combined with automatic tuple expansion).
>
>
>  2. A filter
>>
>> The other thing is the ability to skip uninteresting elements. This is
>> typically performed with the first line of the loop testing a condition,
>> and then continue:
>> foreach(i, t; things)
>> {
>>   if(!t.isInteresting)
>>     continue;
>>   ...
>> }
>>
>
> foreach(t; things.filter!(t => t.isInteresting))
> {
> }
>
> Ditto about the index loop variable.
>
>
>  I've tried to approach the problem with std.algorithm, but I find the
>> std.algorithm statement to be much more noisy and usually longer when the
>> loops are sufficiently simple (as they usually are in my case, which is
>> why
>> the trivial conditions are so distracting by contrast).
>>
>
> The two examples above look a *lot* cleaner and less noisy (declarative!)
> to me than the imperative approach using if-break or if-continue.


/agree completely.
This is nice, I didn't think of writing statements like that :)
That's precisely the sort of suggestion I was hoping for. I'll continue
like this.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.puremagic.com/pipermail/digitalmars-d/attachments/20140114/1cb6c3c1/attachment-0001.html>


More information about the Digitalmars-d mailing list