What’s wrong with `foo()` again? To me, a `_` in the parameter list means that something is there, but the label doesn’t matter.
- Dave Sweeris > On May 5, 2016, at 9:42 AM, Alex Hoppen via swift-evolution > <swift-evolution@swift.org> wrote: > > The idea of adding a syntax to reference zero-argument functions just like > foo(arg:) is used to reference a one-parameter function has come up several > times on the list. Pyry and I have put together a proposal to let foo(_) > refer to a function foo without any parameters. GitHub-Link: > https://github.com/ahoppen/swift-evolution/blob/reference-zero-param-func/proposals/0000-refernce-zero-param-func.md > > <https://github.com/ahoppen/swift-evolution/blob/reference-zero-param-func/proposals/0000-refernce-zero-param-func.md> > > Comments welcome, especially if someone thinks that any of the issues listed > in "Possible issues" are major or sees any other problems. > > – Alex > > > Referencing zero-parameter functions > > Proposal: SE-NNNN > <https://github.com/apple/swift-evolution/blob/master/proposals/NNNN-name.md> > Author(s): Alex Hoppen <https://github.com/ahoppen>, Pyry Jahkola > <https://github.com/pyrtsa> > Status: Draft > Review manager: TBD > > <https://github.com/ahoppen/swift-evolution/tree/reference-zero-param-func#introduction>Introduction > > Since the approval of SE-0021 > <https://github.com/apple/swift-evolution/blob/master/proposals/0021-generalized-naming.md> > it is possible to reference a function by its argument names using the > foo(arg:) syntax but there is no way to reference a zero-parameter function. > This proposal adds a new syntax foo(_) to reference an overloaded function > with zero parameters. > > This was one point in the discussion: [Pitch] Richer function identifiers, > simpler function types > <http://thread.gmane.org/gmane.comp.lang.swift.evolution/15577/> > > <https://github.com/ahoppen/swift-evolution/tree/reference-zero-param-func#motivation>Motivation > > Consider the following example > > class Bar { > func foo() { > } > > func foo(arg: Int) { > } > } > You can reference foo(arg: Int) using Bar.foo(arg:) but there is currently no > syntax to reference foo() without using disambiguation by type Bar.foo() as > () -> Void. We believe this is a major hole in the current disambiguation > syntax. > > > <https://github.com/ahoppen/swift-evolution/tree/reference-zero-param-func#proposed-solution>Proposed > solution > > We propose that Bar.foo(_) references the function with no parameters just as > Bar.foo(arg:) references the function with one argument named arg. > > In the context of functions declarations _ already has the meaning of "there > is nothing" (e.g. func foo(_ arg: Int)). Thus, we believe that _ is the right > character to mean that a function has no parameters. > > > <https://github.com/ahoppen/swift-evolution/tree/reference-zero-param-func#detailed-design>Detailed > design > > The unqualified-name grammar rule from SE-0021 > <https://github.com/apple/swift-evolution/blob/master/proposals/0021-generalized-naming.md> > changes to > > unqualified-name -> identifier > | identifier '(' ((identifier | '_') ':')+ ')' > | identifier '(_)' > If two overloads with zero-parameters exist with different return types, > disambiguation has still to be done via as just like with the foo(arg:) > syntax. > > > <https://github.com/ahoppen/swift-evolution/tree/reference-zero-param-func#impact-on-existing-code>Impact > on existing code > > This is a purely additive feature and has no impact on existing code. > > > <https://github.com/ahoppen/swift-evolution/tree/reference-zero-param-func#possible-issues>Possible > issues > > If Swift should ever support out-only parameters Bar.foo(_) could mean that > the only out-only parameter shall be ignored. This would clash with the > currently proposed syntax. However, since Swift functions may return multiple > values as a tuple, we don't see this coming. > > Bar.foo(_) may be mistaken for Bar.foo(_:) if there is also a one-parameter > function without a label. This mistake would, however, be mostly detected by > the compiler when later calling the function with an argument. > > > <https://github.com/ahoppen/swift-evolution/tree/reference-zero-param-func#alternatives-considered>Alternatives > considered > > > <https://github.com/ahoppen/swift-evolution/tree/reference-zero-param-func#alternative-1-barfoo>Alternative > 1: Bar.foo > > Let Bar.foo reference the function with zero parameters only. While this > works around the possible issue of ignored out-only parameters described > above, this has several minor drawbacks to the proposed solution (some of > these drawbacks are mutually exclusive based on possible future proposals but > one always applies): > > Most functions are not overloadad and using the base name only offers a > shorthand way to reference these functions. > This would block the way of allowing properties with the same name as a > function with zero parameters by banning Bar.foo as a function reference > (could be another proposal once this one is accepted). > Bar.foo(arg:) hints that a function is referenced by its paranthesis. Bar.foo > doesn't include paranthesis, which causes a subtle inconsistency. > > <https://github.com/ahoppen/swift-evolution/tree/reference-zero-param-func#alternative-2-barfoo-inside-selector>Alternative > 2: Bar.foo() inside #selector > > Let Bar.foo() refer to the zero-parameter function only inside #selector as > it was proposed by Doug Gregor here > <https://github.com/apple/swift-evolution/pull/280#discussion_r61849122>. > This requires the proposal to disallow arbitrary expressions in #selector > (GitHub-Link > <https://github.com/ahoppen/swift-evolution/blob/arbitrary-expressions-in-selectors/proposals/0000-arbitrary-expressions-in-selectors.md>) > to be approved. Issues we see are: > > This gives the illusion that foo is actually called which it isn't > It doen't solve the issue of referncing a zero-parameter function in > arbitrary expressions somewhere else in code. > > <https://github.com/ahoppen/swift-evolution/tree/reference-zero-param-func#future-directions>Future > directions > > If this proposal is accepted there is no need that Bar.foo references a > function with base name foo since there is a notation with paranthesis for > every argument constellation. We could disallow Bar.foo to reference a > function and allow a property named foo on Bar. Bar.foo would then refer to > this property. > > _______________________________________________ > swift-evolution mailing list > swift-evolution@swift.org > https://lists.swift.org/mailman/listinfo/swift-evolution
_______________________________________________ swift-evolution mailing list swift-evolution@swift.org https://lists.swift.org/mailman/listinfo/swift-evolution