> On 23 Feb 2017, at 12:49, Vladimir.S <[email protected]> wrote:
> 
> On 23.02.2017 14:17, Haravikk wrote:
>> 
>>> On 22 Feb 2017, at 21:25, Patrick Pijnappel <[email protected]
>>> <mailto:[email protected]>> wrote:
>>> 
>>> To summarize, there's one ambiguous case we'd need to resolve:
>>> 
>>> func foo(_ x: Int, reportingOverflow)
>>> func foo(_ x: Int, _ reportingOverflow: Bool)
>>> 
>>> let reportingOverflow = true
>>> foo(5, reportingOverflow) // Ambiguous
>>> 
>>> One solution is to make trailing argument labels syntactic sugar for a
>>> trailing void argument.
>>> That would allow breaking ambiguity by specifying it explicitly:
>>> 
>>> foo(5, reportingOverflow: ())
>>> 
>>> A related issue is the call-site ambiguity for the reader (less of a
>>> problem if Xcode highlighted argument labels).
>> 
>> Vladimir suggested that an alternative might be to use a leading colon to
> 
> There is another alternative I can think of, based on feature that was 
> discussed at some point of time the list: anonymous enums, i.e. when you can 
> declare enum inside function declaration, when such enum has almost no 
> meaning outside of the function call.
> 
> I.e. something like this:
> 
> func foo(_ x: Int, with: (.reportingOverflow))
> 
> foo(10, with:.reportingOverflow)
> 
> I.e. you can have more than one enum case here if you want:
> func foo(_ x: Int, with: (.reportingOverflow, .otherFlag))
> // IIRC, such syntax was discussed:
> // func foo(_ x: Int, with: (.reportingOverflow | .otherFlag))
> 
> foo(10, with:.otherFlag)
> 
> But such anonymous enums were considered as bad idea during the discussion, 
> so…

Yeah, I was one of the ones who liked the idea but it never seemed to get much 
traction unfortunately.

Part of the problem though with using enums to select methods is that it's not 
immediately obvious what they're doing; if you look at the signature for a 
method you see a type, then have to investigate what it is and find it only has 
one case, which is confusing. Documentation then needs to fill in all the gaps 
to explain that it will only ever have one case (e.g- it's not an enum that may 
be expanded with more options in future), and that's it's for selecting 
methods. A single-case ad-hoc enum could be a bit clearer, but it's still more 
of a workaround.

I think having a proper language feature is still the way to go, as it can be 
more obvious at the function declaration that it's something different, since 
it would be an untyped parameter.

You mentioned another possibility of putting the extra label after the 
function, and I've been thinking about that as well, because the interesting 
thing about that is it could be thought of as a kind of label on the return 
type.

        func adding(_ other:Self) -> Self
        func adding(_ other:Self):reportingOverflow -> (Self, Bool)

        let resultOnly = a.adding(b)
        let resultReportingOverflow = a.adding(b):reportingOverflow

You did say it looks a bit like an operation on the result, but I suppose 
another way of thinking about it is that until you set (or omit) 
:reportingOverflow then you're actually calling *both* methods with two 
possible results, and by adding that you tell Swift which one you want. It 
could be a very neat thing to use as well within modern auto-complete; type out 
the method at which point you can either hit space to move onto something else, 
hit period to call a method on the result, or hit colon to narrow down the 
result to something more specific.

Ack, I think I'm confusing myself now as to which solution I prefer. Having the 
trailing label *after* the function call does have merits as well.
_______________________________________________
swift-evolution mailing list
[email protected]
https://lists.swift.org/mailman/listinfo/swift-evolution

Reply via email to