[swift-evolution] Revisiting SE-0110
John McCall
rjmccall at apple.com
Fri May 26 10:39:22 CDT 2017
> On May 25, 2017, at 3:16 PM, Mark Lacey <mark.lacey at apple.com> wrote:
>> On May 25, 2017, at 11:27 AM, John McCall via swift-evolution <swift-evolution at swift.org> wrote:
>>
>>> On May 25, 2017, at 2:23 PM, Nevin Brackett-Rozinsky via swift-evolution <swift-evolution at swift.org> wrote:
>>> One possibility is to make parentheses consistently meaningful in closure argument lists, so that “(a, b)” would exclusively mean “there is one parameter of tuple-type, which is being destructured”, while “a, b” without parentheses would exclusively mean “there are two parameters”.
>>>
>>> That way you can destructure a tuple parameter if you wish (by using parentheses) or you can leave the tuple intact (by listing a single identifier without parentheses).
>>
>> The problem with this is that we also need some way to be explicit about the return type, and it would be strange to allow (and require!)
>> { a, b -> Int in }
>> when that's not at all a valid way to write a function type
>
> This is allowed today, but I agree it would be very strange to require it.
I suppose I should have tested that. :)
> We also allow:
> { (a, b: Int) -> Int in } // infer ‘a' from context
> and
> { (a, b: () -> Int) -> Int in } // infer ‘a' from context
> but these become completely ambiguous if you remove the parens.
Yeah, I think we need to stick with allowing the parens.
>> . Also it would be an enormous source break, even worse than this problem.
>
> Yes.
>
>> That said, I'm quite sympathetic to the idea that directly destructuring tuples in closure parameter lists is too useful to lose, even if it's ambiguous.
>
> I think the right thing to do here is add uniform tuple destructuring in functions, but that is clearly out of scope for 4.0.
The non-closure aspects of this would not be difficult. All the complexity is in deciding what to do with closures.
> Reverting SE-0110 is not as simple as reverting a single change. So far I have found 19 commits that addressed different aspects moving from the old behavior by searching for SE-110 and SE-0110 in commit logs. It is possible there were others that did not specifically call out the proposal.
> Having said that, we are supposed to support the old behavior for "-swift-verison 3", so it may be possible to find the handful of places where the version check can be removed and old behavior restored under "-swift-verson 4" if we choose to do that as mitigation until the destructuring feature is properly designed and implemented.
Oh, that's an interesting option.
> Another option is attempting to do some targeted fix specifically for closure arguments but that does not seem straightforward, and does seem relatively risky.
John.
>
> Mark
>
>
>>
>> John.
>> _______________________________________________
>> 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