Corrections, additions below…

> Let's consider the following declarations:
> 
>     class Bar {
>         func baz()                   // #8 Method named 'Bar.baz(_)' with 
> type 'Bar -> () -> ()'.
>         func baz(x y: Int)           // #9 Method named 'Bar.baz(x:)' with 
> type 'Bar -> Int -> ()'.
>         static func baz(x: Int = 0)  // #10 Static method named 
> 'Bar.Self.baz(x:)' with type 'Int -> ()'.
>     }
>     // ...
>     let bar = Bar()
>     let f10 = bar.baz                // error: not a function reference, did 
> you mean 'bar.baz(_)' or 'bar.baz(x:)'?
>     let f11 = bar.baz(_)             // #18 Function synonymous to the 
> closure '{ bar.baz() }' with type '() -> ()'.
>     let f12 = bar.baz(x:)            // #19 Function synonymous to the 
> closure '{ bar.baz(x: $0) }' with type 'Int -> ()'.
>     let f13 = Bar.Self.baz(x:)       // #20 Function synonymous to the 
> closure '{ Bar.baz(x: $0) }' with type 'Int -> ()'.
>     let f14 = Bar.Self.baz(_)        // #21 Function synonymous to the 
> closure '{ Bar.baz() }' with type '() -> ()'.

(…)

> C2: Extend SE-0021 
> <https://github.com/apple/swift-evolution/blob/master/proposals/0021-generalized-naming.md>
>  by removing the ambiguity between instance and type members. From now on, 
> `Bar.baz(_)` 

That was meant to read:

"(…) From now on, `Bar.baz(_)` unambiguously refers to the instance method 
named `baz(_)`. To refer to the static or class method named `baz(_)`, put the 
keyword `.Self` between the type and the base name. This syntax should align 
with the outcome of SE-0068 
<https://github.com/apple/swift-evolution/blob/master/proposals/0068-universal-self.md>
 such the keyword resembles the static method call `thing.Self.baz()` of a 
`thing` of type `Bar`."

(Alternatives considered: (1) the use of `Bar.self.baz(_)` with lower-case 
`self`, which is probably more confusing; and (2) inverting the choice and 
making the instance method require a keyword instead, which would harm 
readability as it's usually the instance method that you'd refer to and not the 
static one.)

> C6: Clarify that by using the base name `foo` for a function, the same scope 
> cannot define a variable with the name `foo`. And, vice versa, in a scope 
> that defines a variable named `foo`, there can be no function `foo(...)` 
> defined at the same scope level.

This doesn't prevent shadowing of course. E.g. An inner scope with a variable 
named `foo` would shadow all functions named `foo(...)` of an enclosing scope.

> The implications are:
> 
> I1: The use of a function's base name to refer to a function will cease to 
> work. It has, however, been buggy up to this date. Consider the following:
> 
>     let f = [Int].prefix // '[Int] -> Int -> ArraySlice<Int>'
> 
>     let g1 = [Int].dropFirst // Inexplicably chooses the '[Int] -> Int -> 
> ArraySlice<Int>' overload!
>     let g2 = [Int].dropFirst as [Int] -> () -> ArraySlice<Int> // 
> Disambiguate by type.
> 
>     let h1 = [Int].sorted // Chooses the '[Int] -> () -> [Int]' overload, 
> unlike 'dropFirst' above.
>     let h2 = [Int].sorted as [Int] -> ((Int, Int) -> Bool) -> [Int] // 
> Disambiguate by type.

By the way, the same also happens with the current Swift (both 2.2 and 3 
master) when referring to the partially applied instance method like so:

    let xs = [1,3,2]
    let g = xs.dropFirst // Chooses the 'Int -> ArraySlice<Int>' overload.
    let h = xs.sorted    // Chooses the '() -> [Int]' overload, unlike 
'dropFirst' above.

> I3: Function argument lists are no longer that special and there's no need to 
> notate single-n-tuple argument lists separately from n-argument functions, 
> i.e. SE-0066 
> <https://github.com/apple/swift-evolution/blob/master/proposals/0066-standardize-function-type-syntax.md>
>  is not really needed anymore. The new intuition here is that it's the 
> function's name that defines how a function can be called, not its type.

In yet other words, we don't have to capture the arity of a function in the 
type system at all—it's enough to carry that information around in the function 
name.

~>

Finally, this was a fairly technical pitch but a pitch anyway. Any ideas pro or 
against?

— Pyry

_______________________________________________
swift-evolution mailing list
swift-evolution@swift.org
https://lists.swift.org/mailman/listinfo/swift-evolution

Reply via email to