> On 10 Jun 2016, at 21:53, Xiaodi Wu <[email protected]> wrote:
> 
> I had quite a visceral reaction to the example given at one point:
> 
> for number in fibonacci where number % 2 == 0 while number < 4_000_000 {...}
> 
> This, IMO, is long enough to cause a heart attack.

This is not what’s being discussed though, that’s a separate feature request 
and I’ve already pointed out that I’m not that comfortable with allowing both 
where and while on the same line. That said, it’s worth remembering that syntax 
highlighting doesn’t always carry into the mailing list; in Xcode the 
colouration of “where” makes it a pretty significant separator between the loop 
and the where clause, which a “while” clause would presumably do too.

Although it’s not IMO that bad of an example (though I’m not sure I’d actually 
write something like that personally), I feel it’s worth pointing out that when 
using the guard alternatives there is absolutely nothing (besides common 
decency) stopping me from writing the following if I want to:

        for number in fibonacci { guard number % 2 == 0 else { continue }; 
guard number < 4_000_000 else { break }; … }

Compared to that the for in where while variant is very elegant.

The appeal of where clauses to me is that they are a neat way to handle simple, 
common cases. In my own code the cases where I’d like to see a “while” variant 
would not be used in combination with where, in fact I can’t currently find any 
instance in my code where I have both a guard continue and a guard break that 
could be rolled into a single where while condition (I have maybe three loops 
that have both of these, but when I do they’re not both right at the start). 
That said, this is not an argument for removing where, it’s an argument for 
refining the proposal for a “while” variant, e.g- allow only one of these per 
loop (which also solves any confusion around the order they are evaluated in).

> Regarding some of the numbers that have come up about for in vs for in where 
> loops (in my own code I’m close to maybe of 20% of my for in loops using it), 
> it’s important to recognise that the use of the where clause isn’t well 
> advertised. When I started out with Swift I only knew that it could be used 
> on cases in a switch statement, and later that it was used with complicated 
> generics. It wasn’t until I joined the mailing list that I found out it could 
> be used with conditional bindings and loops, but when I did I started using 
> it almost immediately.
> 
> Since it is so obscure, I think it'd be fair to say that the feature is not 
> fundamental to Swift's "character" or "style." In fact, I understand that it 
> was added only later. I could buy the argument that, if advertised widely, 
> people would find ways to use it more widely and perhaps even generally 
> correctly.

The latter is what I believe; if I’d known about it sooner I would have used it 
sooner, but the Swift introduction I followed only seemed to use it on case 
statements. I found out about the other uses later for generics when I ran into 
the limitations of very basic type-only generics, and later still for 
conditional binding (at which point I tried it on while and for loops too).

The same is true of pattern matching btw; I didn’t learn about that until I 
joined the mailing list either, but I wouldn’t want rid of that feature either 
as now that I’m aware of it I find it very useful. Given that the two features 
are kind of linked  since “where" was apparently being introduced with a view 
towards more powerful pattern matching, it’d be interesting to find out what 
that more powerful pattern matching was going to look like.

Whether either feature became vestigial or not in terms of their intended 
design, both are useful constructs that I think just need to be championed more.
_______________________________________________
swift-evolution mailing list
[email protected]
https://lists.swift.org/mailman/listinfo/swift-evolution

Reply via email to