> This reads to me as “repeat the following block until this fails to be true”, 
> the conditional binding in this case fails to be true if someCondition(value) 
> isn’t true, so the loop ends. I think the key thing here is that the where 
> clause is for the conditional binding and not the loop itself, so in this 
> respect it behaves exactly like an if or guard statement. Meanwhile:
> 
>       for eachValue in theValues where someCondition(eachValue) { … }
> 
> Reads as “for everything in theValues do the following if 
> someCondition(eachValue) is also true”, in other words this loop always tries 
> to visit every element of the sequence (a while loop has no implicit 
> awareness of the sequence, it’s really just an if statement that runs over 
> and over). In this case the where clause is part of the loop itself. There 
> may be an argument that where should be renamed on for loops to better 
> distinguish this, but once you consider that there’s no pattern or 
> conditional binding here I think it makes a reasonable amount of sense.

The original sin here was in connecting the `where` clause to the for loop's 
sequence expression, rather than its pattern. If `where` were positioned right 
after the loop variable:

        for eachValue where someCondition(eachValue) in theValues { … }

It would be much clearer that `where` constrains the values seen by the loop 
body.

I'm not sure why the `where` clause was placed where it is. I suspect it has 
something to do with the `where` clause potentially being more complex than the 
sequence expression, but I was not in the room where it happened, so that's 
idle speculation.

-- 
Brent Royal-Gordon
Architechies

_______________________________________________
swift-evolution mailing list
swift-evolution@swift.org
https://lists.swift.org/mailman/listinfo/swift-evolution

Reply via email to