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

Reply via email to