[swift-evolution] [draft] Compound Names For Enum Cases

Dennis Weissmann dennis at dennisweissmann.me
Fri Feb 3 12:12:31 CST 2017


I'm also +1 on this, wanted this for a long time :)

- Dennis

> On Feb 2, 2017, at 2:42 PM, Adrian Zubarev via swift-evolution <swift-evolution at swift.org> wrote:
> 
> Great, thanks. Love it :) 
> 
> +1 
> 
> 
> 
> 
> -- 
> Adrian Zubarev
> Sent with Airmail
> 
> Am 2. Februar 2017 um 14:39:43, Daniel Duan (daniel at duan.org <mailto:daniel at duan.org>) schrieb:
> 
>> This has been answered in various forms in the thread. Short answer: yes.
>> 
>> On Feb 2, 2017, at 2:05 AM, Adrian Zubarev <adrian.zubarev at devandartist.com <mailto:adrian.zubarev at devandartist.com>> wrote:
>> 
>>> Is that correct that this proposal will add some sort of overloading enum cases by different labels?
>>> 
>>> enum Foo {
>>>     case foo(a: Int)
>>>     case foo(a: Int, b: Int)
>>> }   
>>> Is Foo a valid enum after this proposal?
>>> 
>>> 
>>> 
>>> -- 
>>> Adrian Zubarev
>>> Sent with Airmail
>>> 
>>> Am 19. Januar 2017 um 19:37:50, Daniel Duan via swift-evolution (swift-evolution at swift.org <mailto:swift-evolution at swift.org>) schrieb:
>>> 
>>>> Hi all,
>>>> 
>>>> Here’s a short proposal for fixing an inconsistency in Swift’s enum. Please share you feedback :)
>>>> 
>>>> (Updating/rendered version: https://github.com/dduan/swift-evolution/blob/compound-names-for-enum-cases/proposals/NNNN-Compound-Names-For-Enum-Cases.md <https://github.com/dduan/swift-evolution/blob/compound-names-for-enum-cases/proposals/NNNN-Compound-Names-For-Enum-Cases.md>)
>>>> 
>>>> 
>>>> ## Introduction
>>>> 
>>>> Argument labels are part of its function's declaration name. An enum case
>>>> declares a function that can be used to construct enum values. For cases with
>>>> associated values, their labels should be part of the constructor name, similar
>>>> to "normal" function and methods. In Swift 3, however, this is not true. This
>>>> proposal aim to change that.
>>>> 
>>>> ## Motivation
>>>> 
>>>> After SE-0111, Swift function's fully qualified name consists of its base name
>>>> and all argument labels. As a example, one can invoke a function with its
>>>> fully name:
>>>> 
>>>> ```swift
>>>> func f(x: Int, y: Int) {}
>>>> 
>>>> f(x: y:)(0, 0) // Okay, this is equivalent to f(x: 0, y: 0)
>>>> ```
>>>> 
>>>> This, however, is not true when enum cases with associated value were
>>>> constructed:
>>>> 
>>>> ```swift
>>>> enum Foo {
>>>>     case bar(x: Int, y: Int)
>>>> }
>>>> 
>>>> Foo.bar(x: y:)(0, 0) // Does not compile as of Swift 3
>>>> ```
>>>> 
>>>> Here, the declared name for the case is `foo`; it has a tuple with two labeled
>>>> fields as its associated value. `x` and `y` aren't part of the case name. This
>>>> inconsistency may surprise some users.
>>>> 
>>>> Using tuple to implement associated value also limits us from certain layout
>>>> optimizations as each payload need to be a tuple first, as opposed to simply be
>>>> unique to the enum.
>>>> 
>>>> ## Proposed solution
>>>> 
>>>> Include labels in enum case's declaration name. In the last example, `bar`'s
>>>> full name would become `bar(x:y:)`, `x` and `y` will no longer be labels in a
>>>> tuple. The compiler may also stop using tuple to represent associated values.
>>>> 
>>>> ## Detailed design
>>>> 
>>>> When labels are present in enum cases, they are now part of case's declared name
>>>> instead of being labels for fields in a tuple. In details, when constructing an
>>>> enum value with the case name, label names must either be supplied in the
>>>> argument list it self, or as part of the full name.
>>>> 
>>>> ```swift
>>>> Foo.bar(x: 0, y: 0) // Okay, the Swift 3 way.
>>>> Foo.bar(x: y:)(0, 0) // Equivalent to the previous line.
>>>> Foo.bar(x: y:)(x: 0, y: 0) // This would be an error, however.
>>>> ```
>>>> 
>>>> Note that since the labels aren't part of a tuple, they no longer participate in
>>>> type checking, similar to functions:
>>>> 
>>>> ```swift
>>>> let f = Foo.bar // f has type (Int, Int) -> Foo
>>>> f(0, 0) // Okay!
>>>> f(x: 0, y: 0) // Won't compile.
>>>> ```
>>>> 
>>>> ## Source compatibility
>>>> 
>>>> Since type-checking rules on labeled tuple is stricter than that on function
>>>> argument labels, existing enum value construction by case name remain valid.
>>>> This change is source compatible with Swift 3.
>>>> 
>>>> ## Effect on ABI stability and resilience
>>>> 
>>>> This change introduces compound names for enum cases, which affects their
>>>> declaration's name mangling.
>>>> 
>>>> The compiler may also choose to change enum payload's representation from tuple.
>>>> This may open up more space for improving enum's memory layout.
>>>> 
>>>> ## Alternatives considered
>>>> 
>>>> Keep current behaviors, which means we live with the inconsistency.
>>>> 
>>>> _______________________________________________
>>>> swift-evolution mailing list
>>>> swift-evolution at swift.org <mailto:swift-evolution at swift.org>
>>>> https://lists.swift.org/mailman/listinfo/swift-evolution <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

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.swift.org/pipermail/swift-evolution/attachments/20170203/2d36d0b6/attachment.html>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: smime.p7s
Type: application/pkcs7-signature
Size: 3585 bytes
Desc: not available
URL: <https://lists.swift.org/pipermail/swift-evolution/attachments/20170203/2d36d0b6/attachment.p7s>


More information about the swift-evolution mailing list