Not much, I think. The `where` clause already exists, conditional `let` and 
`var` binding already exists. It'd take loosening up conditional binding rules 
a bit and expanding the lexical structure to include `let` and `var` bindings 
in `repeat`.

> On Jun 10, 2017, at 2:01 PM, Goffredo Marocchi <pana...@gmail.com> wrote:
> 
> Quite interesting :), what impact would it have on the compiler?
> 
> Sent from my iPhone
> 
> On 10 Jun 2017, at 11:46, Gor Gyolchanyan via swift-evolution 
> <swift-evolution@swift.org <mailto:swift-evolution@swift.org>> wrote:
> 
>> I think a better way of achieving this would be to use the already existing 
>> `where` keyword in loops. The way it works right now is as follows:
>> 
>> let many = [1, 2, 3, 4, 5]
>> for each in many where each % 2 == 0 {
>>      print("found an even number: \(each)")
>> }
>> 
>> Unfortunately, unlike all other conditional scopes, `where` does not allow 
>> `let` and `var` bindings in it, so I'd suggest we add ability to do that:
>> 
>> let many: [Int?] = [1, 2, nil, 3, 4, nil, 5]
>> for each in many where let number = each {
>>      print("found a non-nil number: \(number)")
>> }
>> 
>> Or, more interestingly:
>> 
>> for each in many where let number = each, number % 2 == 0 {
>>      print("found a non-nil even number: \(number)")
>> }
>> 
>> And in case of a while loop:
>> 
>> var optional: Int? = 1
>> while let nonoptional = optional {
>>      if nonoptional >= 10 {
>>              optional = nil
>>      }
>>      optional = nonoptional + 1
>> }
>> 
>> But this is only for optional unpacking, so another addition would be to 
>> allow any `let` and `var` bindings in conditional scopes without them 
>> contributing to the condition itself:
>> 
>> while let a = 0, a < 10 {
>>      a += 1
>>      print(a)
>> }
>> 
>> And finally, allow these bindings in `repeat`:
>> 
>> repeat let a = 0 {
>>      a += 1
>>      print(0)
>> } while a < 10
>> 
>> I think **if** the core team would consider this a worthwhile addition, this 
>> would be a less invasive and more intuitive way of achieving what you want.
>> 
>>> On Jun 10, 2017, at 1:31 PM, Haravikk via swift-evolution 
>>> <swift-evolution@swift.org <mailto:swift-evolution@swift.org>> wrote:
>>> 
>>> Not sure if my e-mail didn't go through or if discussion just fizzled out; 
>>> one other benefit if we ever move to a proper message board is we might 
>>> gain the ability to bump topics. Anyway, I'll resend my message just in 
>>> case:
>>> 
>>> 
>>> 
>>> Just to add my thoughts, as I like the idea of adding the variables to the 
>>> start somehow, but was wondering if might make sense to have a keyword such 
>>> as "using", but allow it on all block statements, like-so:
>>> 
>>>     // Original use-case of repeat … while
>>>     repeat using (var i = 0) {
>>>             // Do something
>>>     } while (i < 20)
>>> 
>>>     // for … in demonstrating combination of using and where
>>>     for eachItem in theItems using (var i = 0) where (i < 20) {
>>>             // Do something either until theItems run out or i reaches 20
>>>     }
>>> 
>>>     // Standard while loop
>>>     while let eachItem = it.next() using (var i = 0) where (i < 20) {
>>>             // As above, but with an iterator and a while loop and 
>>> conditional binding to also stop on nil
>>>     }
>>> 
>>>     // Closure with its own captured variable
>>>     let myClosure:(Int) -> Int = using (var i = 0) { i += 1; return i * $0 }
>>> 
>>>     // If statements as well
>>>     if somethingIsTrue() using (var i = 0) where (i < 20) {
>>>             // Do something
>>>     }
>>> 
>>>     // Or even a do block; while it does nothing functionally new, I quite 
>>> like it aesthetically
>>>     do using (var i = 0) {
>>>             // Do something
>>>     }
>>> 
>>> Unifying principle here is that anything created in the using clause 
>>> belongs to the loop, conditional branch etc. only, but exists outside the 
>>> block itself (thus persisting in the case of loops and closures). I quite 
>>> like the possible interaction with where clauses here as a means to avoid 
>>> simple inner conditionals as well.
>>> 
>>> Basically the two clauses can work nicely together to avoid some common 
>>> inner and outer boilerplate, as well as reducing pollution from throwaway 
>>> variables.
>>> 
>>> Only one I'm a bit iffy on is the closure; I'm trying to avoid declaring 
>>> the captured variable externally, but I'm not convinced that having using 
>>> on its own is clear enough?
>>> 
>>> Anyway, just an idea!
>>> 
>>> _______________________________________________
>>> swift-evolution mailing list
>>> swift-evolution@swift.org <mailto:swift-evolution@swift.org>
>>> https://lists.swift.org/mailman/listinfo/swift-evolution 
>>> <https://lists.swift.org/mailman/listinfo/swift-evolution>
>> 
>> _______________________________________________
>> swift-evolution mailing list
>> swift-evolution@swift.org <mailto:swift-evolution@swift.org>
>> https://lists.swift.org/mailman/listinfo/swift-evolution 
>> <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