[swift-evolution] [Draft] Allow trailing commas in argument lists
Rainer Brockerhoff
rainer at brockerhoff.net
Mon Mar 14 11:16:56 CDT 2016
I continue to be in favor of trailing commas in arrays and enums, but
agree that for method/functions signatures and calls it's not so good.
However, in analogy to `;`s to separate statements on the same line, it
might be useful to consider commas in a similar light; that is, commas
would be required to separate arguments on the same line, but become
optional in multi-line statements. So:
let person = Person(
id: json['id']
name: json['name']
picture: Im2age(picture)
friends: friends
)
but
let person = Person(id: json['id'], name: json['name'], picture:
Im2age(picture), friends: friends)
On 3/14/16 12:08, Tim Schmelter via swift-evolution wrote:
> -1
>
> If we agree with the Swift API Guidelines: "Clarity at the point of use is
> your most important goal", it seems to me that adding trailing commas to a
> method/function signature reduces clarity significantly, with others on
> this thread and the previous articulating the supporting reasons.
>
> As an aside: I also eschew trailing commas in array declarations, but
> recognized that this convention is well established in other languages, and
> am resigned to letting the linter handle that case. I would look to do that
> in this case as well.
>
> --T
>
>
> On Tue, Mar 8, 2016 at 2:07 PM, Grant Paul via swift-evolution <
> swift-evolution at swift.org> wrote:
>
>> ## Introduction
>>
>> Right now, Swift argument lists are not permitted to contain trailing
>> commas. To make multi-line calls easier, we propose allowing trailing
>> commas in argument (and tuple) syntax:
>>
>> let person = Person(
>> id: json['id'],
>> name: json['name'],
>> picture: Im2age(picture),
>> friends: friends,
>> )
>>
>>
>> ## Motivation
>>
>> It’s common for functions to take a number of arguments. In some
>> languages, this can make it difficult to figure out what a function does,
>> leading to patterns like fluent interfaces and configuration objects.
>>
>> Swift, by contrast, handles this very well. Argument labels make sure
>> parameters aren’t confused even when they’re of the same type. And compared
>> to Objective-C, it’s much easier to write a multi-line list of arguments in
>> Swift.
>>
>> However, with a parentheses placement style placing the closing
>> parentheses for a multi-line call on a new line, Swift does not support a
>> trailing comma. Trailing commas have a number of benefits:
>>
>> - It is easier to re-arrange lines (especially in certain text editors)
>> when all lines have commas.
>> - Line-based diffs (as used by most source control systems) only show
>> added lines when adding a new parameter to the end, rather than two lines
>> where one just adds the comma.
>> - It’s more consistent with other Swift lists which do support trailing
>> commas.
>>
>>
>> ## Proposed Solution
>>
>> The proposed solution is to allow and ignore trailing commas in argument
>> lists and tuples:
>>
>> let person = Person(
>> id: json['id'],
>> name: json['name'],
>> picture: Image(picture),
>> friends: friends,
>> )
>>
>> let tuple = (
>> color,
>> 32,
>> )
>>
>>
>> ## Detailed Design
>>
>> Support for trailing commas in argument lists and tuples would make them
>> consistent with Swift’s handling of array literals, which do support
>> trailing commas:
>>
>> let array = [
>> 2,
>> 4,
>> 8,
>> ]
>>
>> There should not be any impact to existing code from this proposal.
>>
>> Support for this syntax is also found in other programming languages like
>> Python, D, and Hack. It’s been proposed for JavaScript (positive response)
>> and PHP (rejected):
>>
>> - JavaScript: https://jeffmo.github.io/es-trailing-function-commas/
>> - PHP: https://wiki.php.net/rfc/trailing-comma-function-args
>>
>>
>> ## Alternatives Considered
>>
>> The main alternative is the existing behavior. This has the benefit of
>> standardizing Swift code on a particular style. However, many people will
>> in practice continue to use a style regardless of support trailing commas,
>> especially for cross-language consistency. It could also lead to
>> JavaScript-inspired parameter ordering:
>>
>> let person =
>> Person(id: json['id']
>> , name: json['name']
>> , picture: Image(picture)
>> , friends: friends)
>>
>> Another alternative would be to support this syntax for function
>> parameters but not tuples. However, this would be an arbitrary
>> inconsistency.
>>
>> _______________________________________________
>> swift-evolution mailing list
>> 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
>
--
Rainer Brockerhoff <rainer at brockerhoff.net>
Belo Horizonte, Brazil
"In the affairs of others even fools are wise
In their own business even sages err."
http://brockerhoff.net/blog/
More information about the swift-evolution
mailing list