> On 19 Apr 2016, at 20:25, Justin Jia <[email protected]> wrote:
> 
> Cons of removing variadic functions:
> 1. More verbose syntax. 
> 2. Break old code. 

The verbosity is only two characters (square brackets), and it needn’t break 
old code:

        Before: func myFunc(values:Foo…)
        After:  func myFunc(values:[Foo])

        Before: myFunc(foo, bar, baz)
        After:  myFunc([foo, bar, baz])

Currently variadic functions just produce an array of arguments anyway, so 
simply translating call-sites to pass in an array guarantees compatibility.

> On Apr 19, 2016, at 10:54 AM, Haravikk <[email protected] 
> <mailto:[email protected]>> wrote:
> 
>> 
>>> On 19 Apr 2016, at 17:51, Vladimir.S <[email protected] 
>>> <mailto:[email protected]>> wrote:
>>> 
>>> I.e. the question is *if we want/need to be able to pass array to existed 
>>> variadic function*. Not about removing the variadic feature("removing" is 
>>> offtop for this poposal, as I understand)
>> 
>> I’d say it’s on-topic, as removing variadic functions would eliminate the 
>> problem entirely, so if it is considered a better alternative then there 
>> would be no need to have an additional means of calling them with an array 
>> of arguments.
>> 
>> Personally the way I see it comes down to variadic functions is this:
>> 
>> Pros:
>> Slightly cleaner syntax at call-site.
>> Possibly optimisations unavailable to Array passing?
>> 
>> Cons:
>> Doesn’t do anything that passing an array directly can’t.
>> Passing an array is actually slightly more flexible (can dynamically pass 
>> more or less arguments as required at the call site).
>> Less explicit type at call site; gives the appearance of passing instance(s) 
>> of Foo, rather than one instance of [Foo], can lead to ambiguity with 
>> overloaded functions.
>> Extra syntax to support (enabling array passing would be more code required 
>> to support this feature)
>> 
>> I’d also argue that variadic functions increase the learning curve, as the 
>> first time you’re presented with one it isn’t necessarily clear what it does 
>> unless you’ve encountered them before. Like I say it can be ambiguous at the 
>> call-site in particular, as it doesn’t show that an array of [Foo] is being 
>> passed as opposed to N instances of Foo (however many are in the call).
>> 
>> While I’ve used them in the past, I’ve never really felt that they simplify 
>> anything enough to justify them, as it’s just two square brackets extra to 
>> pass an array; this is extra noise sure, but clarifies what is actually 
>> happening.
>> 
>> So if variadic functions don’t have any other advantages, then it’s really 
>> just a very minor piece of syntactic sugar that can lead to more confusion, 
>> less explicit types in function calls, an extra piece of syntax to parse and 
>> handle and possibly other features required to support it better (like the 
>> one being inquired about). The only other argument I can think of for them 
>> is that many other languages have them, but that’s not important to me vs 
>> cutting out cruft.
>> 
>> 
>> Short version; removing variadic functions would solve the problem of 
>> defining overloads for both variadic and array types by only ever requiring 
>> the latter.
>> 
>> P.S- I’d also like to note that where possible people should be accepting 
>> Sequences or Collections in their methods anyway rather than arrays 
>> specifically, as it’s more flexible that way ;)

_______________________________________________
swift-evolution mailing list
[email protected]
https://lists.swift.org/mailman/listinfo/swift-evolution

Reply via email to