They would differ in, what at least to me, seems pretty logical ways: >> while !stopped for unit in workToDo where unit.passesTest(condition) { >> unit.process() }
Would be: while !stopped { for unit in workToDo where unit.passesTest(condition) { unit.process() } } >> for unit in workToDo while !stopped where unit.passesTest(condition) { >> unit.process() } Would be: for unit in workToDo { guard !stopped else { break } If unit.passesTest(condition) { unit.process() } } This would likely read even better if "where" was woven into the for: for unit where unit.passesTest(condition) in workToDo while !stopped { unit.process() } Or possibly reformatted to something like: for unit where unit.passesTest(condition) in workToDo while !stopped { unit.process() } l8r Sean Sent from my iPad > On Jun 8, 2016, at 5:42 PM, Tim Vermeulen <tvermeu...@me.com> wrote: > > I’m not sure I follow, how would the two be different? > >> There might be value in entertaining the idea of unifying constructs such >> that they all allow arbitrary combinations of for/while/where/etc. >> >> Such as: >> >> while !stopped for unit in workToDo where unit.passesTest(condition) { >> unit.process() } >> >> Which would mean something different than: >> >> for unit in workToDo while !stopped where unit.passesTest(condition) { >> unit.process() } >> >> And yes, they are very similar visually but differ subtly in meaning, but >> the same can be said about different sentences in english that might all >> share the same words and differ only by their order. It’s not exactly a >> foreign concept! I don’t know of any languages that are quite so expressive >> as that might be. Are there advantages to something more outlandish like >> this? I don’t know. I’m not proposing it directly, just thinking out loud, I >> guess. >> >> l8r >> Sean >> >> >>> On Jun 8, 2016, at 4:44 PM, Haravikk via >>> swift-evolution<swift-evolution@swift.org>wrote: >>> >>> >>>> On 8 Jun 2016, at 17:11, Xiaodi Wu<xiaodi...@gmail.com>wrote: >>>>> On Wed, Jun 8, 2016 at 3:38 AM, >>>>> Haravikk<swift-evolut...@haravikk.me>wrote: >>>>> Yes this could be handled by an if/guard statement with continue, and >>>>> while as proposed here could be done with the same plus a break, but >>>>> these things come up so often that it just makes a lot of sense to get it >>>>> all neatly onto one line. >>>> >>>> As I pointed out above with Tim's example, putting it all on one line is >>>> absolutely not 'neat'--it reads like spaghetti. That is one major beef I >>>> have with this proposal: that it *encourages* writing on one line too many >>>> things that, whether you use `where` or not, are much more clearly written >>>> on multiple lines. If writing everything on one line is for you the major >>>> advantage of this proposal, we could agree on everything else and I would >>>> be very much opposed to this proposal on that basis alone. >>> >>> I’m not proposing that every single loop have all of its conditions crushed >>> onto one line, just like I wasn’t when discussing where on the condition >>> clause thread. The usefulness of where and the proposed while is in the >>> common, simple cases, for example: >>> >>> for eachValue in theValues while eachValue<100 where eachValue % 2 == 0 { … >>> } >>> >>> The alternatives would be: >>> >>> for eachValue in theValues { >>> guard eachValue<100 else { break } >>> guard eachValue % 2 == 0 else { continue } >>> … >>> } >>> for eachValue in theValues.prefix(while: { $0<100 }).filter({ $0 % 2 == 0 >>> }) { … } // Could also be on multiple lines >>> >>> The former wastes vertical space for what it does IMO; it’s fine if the >>> conditions were more complicated, but since they’re not where/while is >>> ideal. The second isn’t terrible, but it’s a pretty noisy way to handle >>> common loop conditions. >>> >>> The use of where/while isn’t about eliminating either of these >>> alternatives, they’re absolutely useful in cases where their drawbacks >>> become advantages. For example the inline guards are great when the >>> conditions are more complex, and necessary if you want to do more than the >>> simple cases allow. The second form is best when you need more than the two >>> methods, alternate methods, or you have predicates you can pass in >>> directly, although personally when I do this I tend to do the chinning on >>> its own lines outside of the loop, leaving me with a loop of: for eachValue >>> in theFilteredValues { … } or whatever. >>> >>>> Closures are--I'm sure you'd agree--a far more advanced concept than >>>> loops. Concepts like closing over a variable are very, very hard. Many >>>> useful things can be written without using closures. Not so many things >>>> could do without loops. It very much matters that a learner might feel >>>> that he or she cannot understand everything about a loop with the handwavy >>>> explanation that it'll "come later”. >>> >>> Not my point at all; my point was about the shorthand for closures not >>> closure as a whole, you can’t learn the closure shorthands without first >>> learning what a closure is. In exactly the same way where/while are just be >>> shorthands for inline if/guard, you don’t need to learn about these clauses >>> to make a functioning loop if you know how to do it with your if/guard >>> statements. In fact it’s better to learn it in this order as once you know >>> what each clause is a shorthand form of (if/guard continue or break) then >>> you know exactly what it does already. >>> >>> >>> Ignoring for a moment that you’re opposed to the where clause in general, >>> what would your thoughts be on only permitting one of where/while in a for? >>> i.e- you would be able to do only one of: >>> >>> for eachValue in theValues where eachValue % 2 == 0 { … } >>> for eachValue in theValues while eachValue<100 { … } >>> >>> But not have both a where and a while on the same line. This eliminates the >>> question mark around the order they are applied in, while still giving us >>> the ability to essentially switch the behaviour of the where from continue >>> to break. I’m not decided whether I want both in a single statement or if I >>> just want to be able to choose between them. It also limits how much goes >>> on one line as you have to use an inline condition to achieve both for a >>> single loop. >>> _______________________________________________ >>> swift-evolution mailing list >>> swift-evolution@swift.org >>> https://lists.swift.org/mailman/listinfo/swift-evolution >> >>
_______________________________________________ swift-evolution mailing list swift-evolution@swift.org https://lists.swift.org/mailman/listinfo/swift-evolution