[swift-evolution] [Draft] Allow trailing commas in argument lists

Evan Maloney emaloney at gilt.com
Thu Mar 10 09:03:04 CST 2016


It feels intuitively wrong to me to change the language so that it accepts incorrect syntax just to make editing/merging/diffing easier.

A trailing comma is as likely to be a mistake as it is some sort of deliberately-taken convenience shortcut. Sometimes I deliberately leave unfinished expressions in place when I go off to do something else, knowing that by hitting ⌘-B the compiler will bring me right back to where I was when I return. I like that the Swift compiler is good at catching my mistakes.

Anyway, I'd bet that for most developers, a vast majority of merge pain is caused by Xcode project files and not commas. If the goal is to address merge pain during development, that would be the place I'd start.

That said, allowing whitespace between elements to act as a delimiter equivalent to a comma would seem to address the original concern, without leaving unsightly dangling commas at the end of things.




> On Mar 8, 2016, at 5: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



More information about the swift-evolution mailing list