As an addendum to this:

If it’s important that the variable be invoked with argument labels, that can 
be provided by having argument labels as part of the variable’s name:

func foo(a: A, b: B) -> C
func bar(from: A, using: B) -> C
// ...
let myA : A = …
let myB : B = ...
var higherOrderABToC(with:until:) : (A, B) -> C = foo(a:b:)
var myC = higherOrderABToC(with: myA, until: myB)
higherOrderABToC = bar(from:using:)
myC = higherOrderABToC(with: myA, until: myB)



> On Jun 30, 2016, at 4:16 PM, Michael Ilseman via swift-evolution 
> <swift-evolution@swift.org> wrote:
> 
> I didn’t see the pre-proposal, and I apologize if this has come up elsewhere 
> on this list, but did you consider the alternative where you must use the 
> compound name to refer to a function? That is:
> 
> func foo(a: A, b: B) -> C
> func bar(from: A, using: B) -> C
> let higherOrderABToC: (A, B) -> C = foo(a:b:)
> higherOrderABToC = bar(from:using:)
> 
> That is, “foo” by itself is an incomplete name, and you must provide the full 
> compound name. This will penalize convenience of references to functions, 
> though you will simplify the overloading logic of functions: two functions 
> are not overloaded if their full compound names differ. This can be thought 
> of as taking SE0021 and running wild, enforcing that all naming of functions 
> use the compound name.
> 
> The notion of providing the name of a function with a full compound name is 
> increasingly common in Swift, with SE0021 generalized naming, improvements to 
> swift_name, SE0044 import-as-member, etc.
> 
> To modify the example from later in the proposal:
> 
> func doSomething(x: Int, y: Int) -> Bool {
>     return x == y
> }
> 
> func somethingElse(a: Int, b: Int) -> Bool {
>     return a > b
> }
> 
> // fn2's type is (Int, Int) -> Bool
> var fn2 = doSomething(x:y:)
> 
> // Okay
> fn2(1, 2)
> 
> // Okay
> fn2 = somethingElse(a:b:)
> 
> The notion here, is that we’re not just dropping argument labels from the 
> type system, but instead we’re hoisting such concerns into the syntax by 
> making them an intrinsic part of the name. Then, if you bind to it with a 
> value, that value of course wouldn’t be called with labels because labels are 
> not part of its name.
> 
> If this is unwieldy, then it’s worth stating how this behaves in the presence 
> of functions overloaded based on argument label alone, as Erica mentions.
> 
> 
>> On Jun 30, 2016, at 3:43 PM, Austin Zheng <austinzh...@gmail.com 
>> <mailto:austinzh...@gmail.com>> wrote:
>> 
>> I would think that the naming guidelines are an argument for reducing the 
>> role of argument labels, if any.
>> 
>> This labeled tuple makes sense, because 'x' and 'y' describe the semantic 
>> meaning of each element (Int which represents an x-coordinate):
>> 
>> let myTuple: (x: Int, y: Int)
>> 
>> This also makes sense, because 'hits' and 'runs' describe the semantic 
>> meaning of each argument (Int which represents number of hits):
>> 
>> let a : (hits: Int, runs: Int) -> Bool
>> 
>> This makes absolutely no sense to me:
>> 
>> let b: (ofHits: Int, forRuns: Int) -> Bool
>> 
>> In fact, 'b' is a better example than the average, because of the naming 
>> guideline point to spell out the semantics of weakly typed arguments in the 
>> argument label.
>> 
>> func getWidget(for provider: Provider, with manifest: ShippingManifest) -> 
>> Widget { /* ... */ }
>> 
>> let widgetGetter : (for: Provider, with: ShippingManifest) = getWidget
>> 
>> At this point, the labels are completely superfluous. They make no sense 
>> except in the context of a method name, because they are prepositional 
>> phrases. Knowing that the Provider is "for" something and something does 
>> something "with" the ShippingManifest is absolutely useless to anyone 
>> reading the code where the method name those labels are part of isn't 
>> immediately obvious.
>> 
>> Austin
>> 
>> On Thu, Jun 30, 2016 at 3:33 PM, Michael Ilseman via swift-evolution 
>> <swift-evolution@swift.org <mailto:swift-evolution@swift.org>> wrote:
>> 
>>> On Jun 30, 2016, at 11:43 AM, Scott James Remnant via swift-evolution 
>>> <swift-evolution@swift.org <mailto:swift-evolution@swift.org>> wrote:
>>> 
>>> -1
>>> 
>>> This proposal doesn’t even use Swift naming style to make its point, as 
>>> soon as you do, the reason why Swift considers argument labels to be part 
>>> of the type signature becomes apparent. 
>>> 
>>> The author of the proposal uses the following example:
>>> 
>>>  func doSomething(x: Int, y: Int) -> Bool
>>> 
>>> 
>>> This is just not Swift-y, a much better example would be:
>>> 
>>>  func sinkBattleship(atX x: Int, y: Int) -> Bool
>>> 
>> 
>> <pedanticism>
>> If you want to talk about pedantic following of API naming guidelines for 
>> example code, then I believe that your example also runs afoul. It would be:
>> 
>> func sinkBattleshipAt(x: Int, y: Int) -> Bool
>> 
>> Due to a special case where the preposition covers multiple arguments. This 
>> arrises mostly from flatten-ed structs as parameters, e.g. from old C APIs 
>> predating struct literal syntax. See:
>> 
>> An exception arises when the first two arguments represent parts of a single 
>> abstraction.
>> 
>> a.move(toX: b, y: c)
>> a.fade(fromRed: b, green: c, blue: d)
>> In such cases, begin the argument label after the preposition, to keep the 
>> abstraction clear.
>> 
>> a.moveTo(x: b, y: c)
>> a.fadeFrom(red: b, green: c, blue: d)
>> 
>> </pedanticism>
>> 
>> 
>> 
>> 
>>> the proposal states that the argument labels be then stripped from the 
>>> type, which would make this method type-compatible with:
>>> 
>>>  func meetsBattingAverage(ofHits hits: Int, forRuns runs: Int) -> Bool
>>> 
>>> 
>>> I don’t think it’s desirable for this to work at all… Argument labels are 
>>> not parameter names, they are a first class part of Swift’s type system, 
>>> and always meaningful when employed properly.
>>> 
>>> 
>>> Scott
>>> _______________________________________________
>>> swift-evolution mailing list
>>> swift-evolution@swift.org <mailto:swift-evolution@swift.org>
>>> https://lists.swift.org/mailman/listinfo/swift-evolution 
>>> <https://lists.swift.org/mailman/listinfo/swift-evolution>
>> 
>> 
>> _______________________________________________
>> swift-evolution mailing list
>> swift-evolution@swift.org <mailto:swift-evolution@swift.org>
>> https://lists.swift.org/mailman/listinfo/swift-evolution 
>> <https://lists.swift.org/mailman/listinfo/swift-evolution>
>> 
>> 
> 
> _______________________________________________
> 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

Reply via email to