Just to be clear (so may previous point may make more sense), the “name” in the
function `func f(x: Int, y: Int) {}` is `f(x:y:)`. The name of `f(a: Int, b:
Int) {}` does *not* share a name with the previous function. That’s what I
refer to when I talk about names. I would not consider these two being both
declared as “overloading”. Here’s a function that I would say is overloading
`f(x:y:)`: `func f(x: String, y: String)`.
One of the benefits (as stated in the motivation section of the proposal) is to
make enum case’s name consistent with functions in Swift.
> On Jan 24, 2017, at 3:16 PM, Christopher Kornher <[email protected]> wrote:
>
>>
>> On Jan 24, 2017, at 4:02 PM, Daniel Duan <[email protected]
>> <mailto:[email protected]>> wrote:
>>
>>
>>
>> Daniel Duan
>> Sent from my iPhone
>>
>> On Jan 24, 2017, at 2:53 PM, Daniel Duan via swift-evolution
>> <[email protected] <mailto:[email protected]>> wrote:
>>
>>>
>>>
>>> Daniel Duan
>>> Sent from my iPhone
>>>
>>> On Jan 24, 2017, at 2:18 PM, Christopher Kornher via swift-evolution
>>> <[email protected] <mailto:[email protected]>> wrote:
>>>
>>>> I agree that this rule would be consistent with the handing of Swift
>>>> function signatures, but my proposal is self-consistent and:
>>>>
>>>> 1) It is more powerful, matching on the case name or not as required.
>>>> 2) Is consistent with existing switches that ignore associated values
>>>> 3) Is constant with ignored labels in other Swift constructs (proposed and
>>>> in past versions of Swift, at least)
>>>> 4) Avoids a possible API change for current enums. This is currently legal
>>>> but would not be if the enum case “name” is the entire signature for
>>>> constructing it:
>>>>
>>>> ```
>>>> enum E {
>>>> case a( a: Int )
>>>> case b( a: Int )
>>>> }
>>>>
>>>> let anEmum = E.a( a: 4 )
>>>>
>>>>
>>>> switch anEmum {
>>>> case .a( let x ) :
>>>> break
>>>> case .b( let x ) :
>>>> break
>>>> }
>>>>
>>>> switch anEmum {
>>>> case .a( let y ) :
>>>> break
>>>>
>>>> case .b( let y ) :
>>>> break
>>>> }
>>>> ```
>>>> So is this proposal worth creating a breaking change? I don’t think so.
>>>> it would be possible to ignore the associated parameter name, but not the
>>>> type, but that would further confuse case matching, I believe.
>>>>
>>>> I personally don’t see much purpose in having two enum cases with the same
>>>> name if they are always treated as distinct and there is no way to reason
>>>> on the case name.
>>>
>>> Would you say the same for functions? Our opinions differ in what
>>> constitute a "name". In Swift, function names include parameters. Each enum
>>> case declares a function that creates a enum value. That's why it's *more*
>>> consistent for enum to have a similar definition of "name".
>>>
>>> As for pattern matching, number of patterns the number of cases being
>>> matched have a many-to-one relationships. This is true in Swift and many
>>>
>>
>> (Ah, accidentally sent it on my iPhone. My apologies.)
>>
>> … other languages. What you are proposing complicates the rules by making
>> this untrue. We'd have to special-case this feature in our pattern matching
>> algorithm.
>
> I am not proposing a breaking change. I believe that it is the best way to
> handle “overloading” enum names without breaking existing code. I don’t
> believe that this proposal changes any existing logic or rules.
>
> The use of the terms "name” and "signature" is well established in many
> languages. e.g.: https://en.wikipedia.org/wiki/Type_signature
> <https://en.wikipedia.org/wiki/Type_signature> I am trying to use the terms
> in this context.
>
> Sharing a function name (with different signatures) is an aid to
> understanding the purpose of functions and is part of many languages. I do
> not believe that extending the concept to enums is worth the cost, especially
> since it will break existing Swift code.
>
> You are proposing a source breaking change and I do not agree that is is an
> improvement. What is the benefit of this change?
>
>
>>
>>>> If they are always distinct, then requiring different names eliminates
>>>> unnecessary cognitive load. There is a good reason for functions to have
>>>> the same “name” and different signatures, and there are precedents in many
>>>> languages.
>>>>
>>>> You may disagree, but I believe that enums exist to support reasoning on
>>>> distinct cases and that muddying that by treating the associated value as
>>>> part of the “signature" increases the language “surface area” while adding
>>>> no tangible benefit.
>>>>
>>>>
>>>>> On Jan 24, 2017, at 2:23 PM, Matthew Johnson via swift-evolution
>>>>> <[email protected] <mailto:[email protected]>> wrote:
>>>>>
>>>>>>
>>>>>> On Jan 24, 2017, at 3:10 PM, Christopher Kornher via swift-evolution
>>>>>> <[email protected] <mailto:[email protected]>> wrote:
>>>>>>
>>>>>> Your example is only has only one case, which is not typical. Perhaps I
>>>>>> am missing something, but the only reason that I can imagine for having
>>>>>> a case with multiple ways to “construct” it is to have all variants of
>>>>>> the case to match. If you don’t want them to match, use a different case
>>>>>> name.
>>>>>
>>>>> It sounds like you are missing something. The `bar(a:)` and `bar(b:)`
>>>>> are the full case names. These are *not* the same case. The `bar`
>>>>> shorthand is allowed when there is no ambiguity, however for an enum with
>>>>> both `bar(a:)` and `bar(b:)` there *is* ambiguity and therefore the `bar`
>>>>> shorthand is not allowed. The programmer is required to spell out the
>>>>> full name of the case they wish to match.
>>>>>
>>>>>
>>>>>>
>>>>>> It would still be possible to match on the different types of bar when
>>>>>> needed:
>>>>>>
>>>>>> ```
>>>>>> enum Foo {
>>>>>> case bar(a: Int)
>>>>>> case bar(b: String)
>>>>>> case notAbar
>>>>>> }
>>>>>>
>>>>>>
>>>>>> switch aFoo {
>>>>>> case .bar( let a: Int) : // matches Ints only
>>>>>> ...
>>>>>>
>>>>>> case .bar( let b: String) : // matches Strings only
>>>>>> ...
>>>>>> }
>>>>>>
>>>>>> switch aFoo {
>>>>>> case .bar : // Matches both cases and that is a good thing
>>>>>> …
>>>>>>
>>>>>> case notAbar:
>>>>>> ….
>>>>>> }
>>>>>>
>>>>>> ```
>>>>>>
>>>>>>> On Jan 24, 2017, at 5:27 AM, Xiaodi Wu via swift-evolution
>>>>>>> <[email protected] <mailto:[email protected]>> wrote:
>>>>>>>
>>>>>>> I would imagine it would be logical to have it work just like it does
>>>>>>> now with functions. If case bar is distinct, then that should still
>>>>>>> work, but if bar is "overloaded," then case bar should be invalid for
>>>>>>> ambiguity. Seems fine to me, shouldn't break any existing code and
>>>>>>> therefore we don't lose anything.
>>>>>>>
>>>>>>>
>>>>>>> On Tue, Jan 24, 2017 at 01:13 David Hart via swift-evolution
>>>>>>> <[email protected] <mailto:[email protected]>> wrote:
>>>>>>>
>>>>>>>
>>>>>>> On 24 Jan 2017, at 00:52, Joe Groff via swift-evolution
>>>>>>> <[email protected] <mailto:[email protected]>> wrote:
>>>>>>>
>>>>>>>> We're not terribly principled about this right now with non-pattern
>>>>>>>> declaration references. You can still reference an unapplied function
>>>>>>>> by its base name alone without its labels, if it's unambiguous:
>>>>>>>>
>>>>>>>> func foo(x: Int, y: Int) {}
>>>>>>>>
>>>>>>>> let foo_x_y: (Int, Int) -> () = foo
>>>>>>>>
>>>>>>>> so it'd be consistent to continue to allow the same in pattern
>>>>>>>> references.
>>>>>>>
>>>>>>> WRT ambiguity, do we loose the ability to pattern match on the naked
>>>>>>> case name when two cases share the same base name?
>>>>>>>
>>>>>>> enum Foo {
>>>>>>> case bar(a: Int)
>>>>>>> case bar(b: String)
>>>>>>> }
>>>>>>>
>>>>>>> switch aFoo {
>>>>>>> case .bar: // matches both cases
>>>>>>> break
>>>>>>> }
>>>>>>> _______________________________________________
>>>>>>> swift-evolution mailing list
>>>>>>> [email protected] <mailto:[email protected]>
>>>>>>> https://lists.swift.org/mailman/listinfo/swift-evolution
>>>>>>> <https://lists.swift.org/mailman/listinfo/swift-evolution>
>>>>>>> _______________________________________________
>>>>>>> swift-evolution mailing list
>>>>>>> [email protected] <mailto:[email protected]>
>>>>>>> https://lists.swift.org/mailman/listinfo/swift-evolution
>>>>>>> <https://lists.swift.org/mailman/listinfo/swift-evolution>
>>>>>>
>>>>>> _______________________________________________
>>>>>> swift-evolution mailing list
>>>>>> [email protected] <mailto:[email protected]>
>>>>>> https://lists.swift.org/mailman/listinfo/swift-evolution
>>>>>> <https://lists.swift.org/mailman/listinfo/swift-evolution>
>>>>>
>>>>> _______________________________________________
>>>>> swift-evolution mailing list
>>>>> [email protected] <mailto:[email protected]>
>>>>> https://lists.swift.org/mailman/listinfo/swift-evolution
>>>>> <https://lists.swift.org/mailman/listinfo/swift-evolution>
>>>> _______________________________________________
>>>> swift-evolution mailing list
>>>> [email protected] <mailto:[email protected]>
>>>> https://lists.swift.org/mailman/listinfo/swift-evolution
>>>> <https://lists.swift.org/mailman/listinfo/swift-evolution>
>>> _______________________________________________
>>> swift-evolution mailing list
>>> [email protected] <mailto:[email protected]>
>>> https://lists.swift.org/mailman/listinfo/swift-evolution
>>> <https://lists.swift.org/mailman/listinfo/swift-evolution>
_______________________________________________
swift-evolution mailing list
[email protected]
https://lists.swift.org/mailman/listinfo/swift-evolution