[swift-evolution] Revisiting SE-0110

Vladimir.S svabox at gmail.com
Tue Jun 6 13:45:44 CDT 2017

On 06.06.2017 20:10, Mark Lacey via swift-evolution wrote:
>> On Jun 6, 2017, at 8:42 AM, Ray Fix via swift-evolution <swift-evolution at swift.org 
>> <mailto:swift-evolution at swift.org>> wrote:
>> FWIW, after doing a project migration last night and this morning, I am reluctantly 
>> +1 for reverting SE-0110 and seeing a new proposal that can be properly evaluated. 
>>  The split-the-difference compromise mentioned seems like just that, a compromise 
>> that will need to be revisited anyway.
>> While I agreed with the spirit of the original proposal, the assertion that "Minor 
>> changes to user code may be required if this proposal is accepted.” seems like it 
>> underestimated the magnitude of the impact. In almost every case, my code lost clarity.
> Did you run into issues other than the “tuple destructuring” issue that began this 
> thread?
> If so, can you provide some examples to illustrate what other issues people are 
> hitting in practice?
> I put “tuple destructuring” in quotes here because although it looks very much like 
> what is happening in Swift 3 and earlier, there was no real tuple destructuring 
> support in parameters (as evidenced by the fact that things like (x, (y, z)) never 
> worked).
> The behavior of allowing:
>    [“key” : 1].map { key, value in … }
> is the result of allowing the two-argument closure to be passed to a function (map) 
> that expects a one-argument function parameter where the argument is a two element tuple.
> I don’t think anyone disagrees that removing this functionality without 
> simultaneously providing a real destructuring feature regresses the usability of the 
> language where closures are concerned.

What if compiler in Swift 4 will be smart enough to generate correct *type* of 
provided closure depending of required type of function parameter *only* if closure 
defined inside the function call *and* has no type annotations for its arguments?

I mean, that having
func fooTuple(_ c: ((Int,Int))->Void) {..}
func fooParams(_ c: (Int,Int)->Void) {..}

, when we call
fooTuple {x,y in }
- compiler probably can generate closure of correct type ((Int,Int))->Void from this 

and for
fooParams {x,y in }
- compiler can generate closure of type (Int,Int)->Void

But, I suggest this can be allowed only if there is no types specified for x,y. This 
is to reduce the ambiguity - we can't just declare the closure constant or func with 
syntax {x,y in } as we need types for x,y in this case, i.e.

let closure1 = {(x: Int, y: Int) in ..} // this is definitely (Int,Int)->()
let closure2 = {(x: (Int, Int)) in ..} // this is definitely ((Int,Int))->()

// let closure3 = {x, y in .. } // invalid syntax

//fooTuple(closure1) // invalid parameter type
//fooParams(closure2) // invalid parameter type
fooTuple {x,y in } // ok, ((Int,Int))->() closure will be generated
fooParams {x,y in } // ok, (Int,Int)->() closure will be generated

So, closure declared inside a func call without types assigned to closure's arguments 
- could be a very special case, when compiler will generate closure of needed type.

As I understand, such solution can dramatically reduce the problems with migration 
developers have. And also this will be Swift3 compatible.

> Understanding other fallout from SE-0110 will be helpful in guiding the decision of 
> how to move forward from here.
> Mark
>> Other aspects of the migration went quite smoothly.
>> BTW, if I were at WWDC this year I would be in the Swift lab pestering them about 
>> this.  Hopefully that feedback is happening. :)
>> Ray
>>> On Jun 6, 2017, at 8:22 AM, Shawn Erickson via swift-evolution 
>>> <swift-evolution at swift.org <mailto:swift-evolution at swift.org>> wrote:
>>> On Tue, Jun 6, 2017 at 7:18 AM Gwendal Roué via swift-evolution 
>>> <swift-evolution at swift.org <mailto:swift-evolution at swift.org>> wrote:
>>>>     Le 6 juin 2017 à 15:30, Vladimir.S <svabox at gmail.com
>>>>     <mailto:svabox at gmail.com>> a écrit :
>>>>     I'm just trying to understand your opinion.
>>>>     Let me know, what result do you *expect* for this Swift4 code given what
>>>>     SE-0066 requires for function types:
>>>>     func foo(x : (Int, Int))->() {}
>>>>     print(type(of: foo))  // ??
>>>>     print(foo is (_: Int, _: Int)->())  // ??
>>>     I couldn't care less.
>>>     What I care about: the code regressions introduced by SE-0110 (look at
>>>     previous messages in this long thread, and the ridiculous state of closures
>>>     that eat tuples), and the migration bugs (look at Xcode 9 release notes).
>>> Note that many of Apple's swift team are likely swamped with WWDC at the moment. 
>>> They are also dealing with merging out their private changes announced so far at 
>>> WWDC. Xcode 9 is prerelease still so expect things to get revised to some degree 
>>> before the final release.
>>> Not say to not voice concerns but at this time some patience will be needed.
>>> -Shawn
>>> _______________________________________________
>>> swift-evolution mailing list
>>> swift-evolution at swift.org <mailto:swift-evolution at swift.org>
>>> https://lists.swift.org/mailman/listinfo/swift-evolution
>> _______________________________________________
>> swift-evolution mailing list
>> swift-evolution at swift.org <mailto:swift-evolution at swift.org>
>> https://lists.swift.org/mailman/listinfo/swift-evolution
> _______________________________________________
> swift-evolution mailing list
> swift-evolution at swift.org
> https://lists.swift.org/mailman/listinfo/swift-evolution

More information about the swift-evolution mailing list