Ever considered looking at how typescript handles argument names in object 
literal deconstruction?

Regards
(From mobile)

On Jul 3, 2016, at 10:36 PM, Pyry Jahkola via swift-evolution 
<swift-evolution@swift.org> wrote:

>> On 30 Jun 2016, Chris Lattner wrote:
>> 
>> The review of "SE-0111: Remove type system significance of function argument 
>> labels" begins now and runs through July 4. The proposal is available here:
>> 
>>      
>> https://github.com/apple/swift-evolution/blob/master/proposals/0111-remove-arg-label-type-significance.md
>> 
>> What is your evaluation of the proposal?
> 
> +1. With the way the community has settled using argument labels, it seems 
> clear to me that argument labels are part of a function's name and should not 
> affect its type.
> 
> What we currently have technically works because the compiler is quite 
> lenient in type conversions between different argument labels. But since 
> there are corner cases lurking where labels in the function type matter (as 
> demonstrated in the proposal), it's best we get rid of them entirely for 
> clarity. As it has been pointed out, the status quo also complicates the 
> overload resolution process and causes confusing error messages when the 
> compiler can't tell if your argument labels are wrong or argument types. 
> We're better without that complexity.
> 
> Further, I think removing this oddity could make function application with 
> tuples feasible again (a.k.a the simple form of "tuple splatting" with all 
> arguments in the tuple) by requiring to fully name the function before 
> passing the arguments tuple:
> 
>     func doSomething(x: Int, y: Int) -> Bool { return true }
>     func doSomething(any: Any) -> Bool { return false } // This can't 
> possibly be considered below.
>     
>     let args = (1, 2)
>     let named = (x: 1, y: 2)
>     let f = doSomething(x:y:)
>     f(args)                 // Unambiguous call, if the syntax is made legal 
> (again).
>     doSomething(x:y:)(args) // So is this.
>     doSomething(args)       // This would still be an error as per SE-0029.
>     let tuples = [(1, 2), (3, 4), (5, 6)]
>     print(tuples.map(f)) // This would be allowed. (Confusingly it already 
> works despite SE-0029!)
> 
> In particular, you couldn't apply a `func` function with a tuple (which was 
> what SE-0029 removed) but you could apply a qualified function reference 
> (SE-0021) as well as a function value (i.e. a named closure) with a tuple, 
> because both of them have set in stone their argument list length before the 
> tuple application and thus suffer from none of the disadvantages listed in 
> the motivation for SE-0029. That would of course need a separate proposal and 
> can be delayed until Swift 3 has been released.
> 
>> Is the problem being addressed significant enough to warrant a change to 
>> Swift?
> 
> Yes.
> 
>> Does this proposal fit well with the feel and direction of Swift?
> 
> I think so.
> 
>> If you have used other languages or libraries with a similar feature, how do 
>> you feel that this proposal compares to those?
> 
> Well, we've had argument labels in Objective-C but since it's not a strongly 
> typed language I don't think it applies for comparison. However, I naturally 
> feel argument labels in Objective-C as well are part of the function's name 
> rather than its type.
> 
>> How much effort did you put into your review? A glance, a quick reading, or 
>> an in-depth study?
> 
> More than a quick reading. I've suggested a similar idea before but didn't 
> motivate it well enough to gain interest back then. Big thanks to Austin for 
> driving it forward this time!
> 
> — Pyry
> 
> PS. Can anybody explain why the last example in my code above turned out to 
> be allowed even though SE-0029 seems to prohibit it? Here's a more 
> comprehensive test which made me positively surprised that it still worked 
> after SE-0029:
> 
>     let f: (Int, Int) -> Int = (+)
>     let x = (1, 2)
>     let x, y = (3, 4)
>     f(1, 2) //=> 3
>     // f((1, 2))                          // Does not compile, as expected 
> (SE-0029).
>     // f(x)                               // Does not compile, as expected.
>     [x, y].map(f) //=> [3, 7]             // Surprisingly compiles, but why?
>     let g: ((Int, Int)) -> Int = f        // Huh? So `f` can coerce to a 
> `(tuple) -> Int`?
>     g(x) //=> 3                           // So this is what made `map` work 
> above.
>     (f as ((Int, Int)) -> Int)(x) //=> 3  // This works too, didn't expect it 
> to.
>     [x, y].map(+)  //=> [3, 7]            // Finally, why is this allowed 
> despite SE-0029?
> 
> _______________________________________________
> 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