> A parameter list of (inout Int, @noescape Int -> ()) is just a ‘tuple + 
> annotations’ relevant to use in parameter lists. If you can restrict this 
> pseudo-type to the appropriate context, like we are heading towards with 
> disallowing ImplicityUnwrappedOptional in function signatures, why not 
> restrict certain type annotations to only occur in function signatures?

Effectively the presence of parameter annotations in a tuple make it a 
‘splat-only tuple’.

From James F

> On 2 Jul 2016, at 05:38, James Froggatt <james.frogg...@me.com> wrote:
> 
> 
>> On 2 Jul 2016, at 05:03, Austin Zheng <austinzh...@gmail.com> wrote:
>> 
>> 
>>> On Jul 1, 2016, at 8:55 PM, James Froggatt <james.frogg...@me.com> wrote:
>>> 
>>> 
>>> On 2 Jul 2016, at 04:46, Austin Zheng <austinzh...@gmail.com> wrote:
>>> 
>>>> 
>>>> 
>>>> This functionality naturally falls out of any decent proposal for variadic 
>>>> generics. I'd rather wait until we can re-add it in a principled manner 
>>>> than stuff yet another @-prefixed special case into the language.
>>>> 
>>> 
>>> Fair point, but it seems this could stand as a lightweight complement to 
>>> generics. There seems to be a lack of support for the side of keeping what 
>>> functionality we already have in this area.
>> 
>> FWIW, I liked and used tuple splat before it was removed from the language.
>> 
>> I thought about it, and I think a lightweight, limited form of tuple 
>> application would probably be worth pursuing even before variadic generics 
>> go into the language (especially since they are a low-priority item). 
>> Perhaps someone could draft a proposal for Swift 3.1.
>> 
> 
> This is why I support keeping what existing semantics we can, rather than 
> stripping it all out only to reimplement it as soon as people realise it's 
> missing.
> 
> The distinction between (Int, Int) and ((Int, Int)) seems trivial.
> 
> A parameter list of (inout Int, @noescape Int -> ()) is just a ‘tuple + 
> annotations’ relevant to use in parameter lists. If you can restrict this 
> pseudo-type to the appropriate context, like we are heading towards with 
> disallowing ImplicityUnwrappedOptional in function signatures, why not 
> restrict certain type annotations to only occur in function signatures?
> 
>>> 
>>>>> 
>>>>>>> 
>>>>>>> Is it though? Couldn't the current confusing situation of tuple labels 
>>>>>>> in the type system be changed in the exact same way?
>>>>>> 
>>>>>> Tuple labels work the way you expect them to work: you can't assign an 
>>>>>> `(a: 1, b: 2)` to a variable of type `(x: Int, y: Int)`. There is 
>>>>>> nothing confusing about them, at least not in the same way that function 
>>>>>> types are.
>>>>>> 
>>>>> 
>>>>> This seems just the same problem as not being able to assign:
>>>>> 
>>>>> (a: Int, b: Int) -> ()
>>>>> 
>>>>> to a type of:
>>>>> 
>>>>> (x: Int, y: Int) -> ()
>>>>> 
>>>>> Functions and tuples are the only uses of labels in the type system I'm 
>>>>> aware of. The reasoning for one case seems likely to apply to the other.
>>>> 
>>>> There was a better argument for this sort of thing before the naming 
>>>> guidelines. Swift 2 argument labels often described the semantic value of 
>>>> their arguments. Now you have guidelines which assign non-descriptive 
>>>> prepositional phrases as argument labels. It makes no sense to pull the 
>>>> prepositional phase comprising the argument label (as opposed to the 
>>>> argument name itself) into the type, since that phrase is meaningless 
>>>> outside the context of the primary function name, but the current system 
>>>> (and any based off it) would do just that.
>>>> 
>>>> So no, I don't think the reasoning for tuple labels applies to function 
>>>> argument labels.
>>>> 
>>> 
>>> Sorry, I meant the reasoning for removing them from the type system. As you 
>>> said, there was a better argument. I'm observing that this may once again 
>>> be the case following this change.
>> 
>> 
>> I still think it would be a bit odd to have (e.g.) a rejuvenated tuple 
>> splatter try to enforce the labels on whatever tuples you pass to it, since 
>> those labels would necessarily be tied to a specific function's name, rather 
>> than the meaning of the arguments themselves. Do you think there would be 
>> too much room for programmer error if such a splatter necessarily took in 
>> unlabeled tuples? (Right now any labeled tuple is interchangeable with a 
>> non-labeled tuple with the same constituent types...)
>> 
> 
> My idea is that if we switch to using:
> 
> let functionType(a:b:) = add(_:_:)
> 
> then it make sense to have tuples match this syntax, to avoid having two 
> similar naming mechanisms with very different semantics:
> 
> let values(x:y:) = (1, 2)
> 
> Like a function's argument labels are rarely sensible out of context, tuples 
> are best passed around without considering their labels. For example:
> 
> let name: (first: String, last: String) = …
> 
> name.first //clear
> 
> func join(stringTuple: (String, String))
> 
> join(stringTuple: name) //is this allowed?
> 
> 
> At this point (generally as soon as the tuple leaves the context of its 
> containing variable), the original parameter labels are meaningless. 
> Alternatively:
> 
> 
> let name(first:last:): (String, String) = …
> 
> name.first //still clear
> 
> join(name) //clearly allowed, since the labels are not part of the type
> 
> 
> With this, if I understand you properly, argument names wouldn't be present 
> in the type system to begin with, so calling the result of a splatter would 
> be predictable:
> 
> join(a: String, b: String)
> 
> let splatted: ((String, String)) -> () = splat(join) // or splat( join(a:b:) )
> 
> splatted(name) // or splatted( name(first:last:) )
> 
>>> 
>>> It doesn't help that this went through to the wrong thread, and the quick 
>>> email I sent to acknowledge this has fallen in a hole somewhere.
>>> 
>>>>> 
>>>>>>> 
>>>>>>> Or are tuples destined to become nothing more than a historical 
>>>>>>> artifact? If this is the case, then we might as well remove them now.
>>>>>> 
>>>>>> Tuples have many, many uses apart from modeling argument lists.
>>>>>> 
>>>>> 
>>>>> • lightweight structs
>>>>> • loosely-typed structs
>>>>> • …as structs
>>>>> 
>>>>> There is no particular reason Void must be modelled as the empty struct, 
>>>>> since any non-subclassable Type.self is likewise a singleton.
>>>>> 
>>>>> So there's nothing really making a compelling argument here.
>>>> 
>>>> What? You asked if tuples were going to become a historical artifact? The 
>>>> answer is, "no, they aren't, because they have uses besides modeling 
>>>> argument labels". Void as the empty tuple is irrelevant to the discussion.
>>>> 
>>> 
>>> I'm not sure how to interpret this, sorry.
>> 
>> Perhaps I misunderstood your original point. In that case, I apologize.
>> 
>>> 
>>>>> 
>>>>>>> 
>>>>>>> ------------ Begin Message ------------ 
>>>>>>> Group: gmane.comp.lang.swift.evolution 
>>>>>>> MsgID: 
>>>>>>> <caow3zebrvo92frnv2xk1y_+s2lqyvouo-fm46bpmuffof2p...@mail.gmail.com> 
>>>>>>> 
>>>>>>> On Thu, Jun 30, 2016 at 11:26 AM Chris Lattner via swift-evolution <
>>>>>>> swift-evolution-m3fhrko0vlzytjvyw6y...@public.gmane.org> wrote:
>>>>>>> 
>>>>>>>> Hello Swift community,
>>>>>>>> 
>>>>>>>> The review of "SE-0111: Remove type system significance of function
>>>>>>>> argument labels" begins now and runs through July 4. The proposal is
>>>>>>>> available here:
>>>>>>>> 
>>>>>>>> 
>>>>>>>> https://github.com/apple/swift-evolution/blob/master/proposals/0111-remove-arg-label-type-significance.md
>>>>>>>> 
>>>>>>>> Reviews are an important part of the Swift evolution process. All 
>>>>>>>> reviews
>>>>>>>> should be sent to the swift-evolution mailing list at
>>>>>>>> 
>>>>>>>> https://lists.swift.org/mailman/listinfo/swift-evolution
>>>>>>>> 
>>>>>>>> or, if you would like to keep your feedback private, directly to the
>>>>>>>> review manager.
>>>>>>>> 
>>>>>>>> What goes into a review?
>>>>>>>> 
>>>>>>>> The goal of the review process is to improve the proposal under review
>>>>>>>> through constructive criticism and contribute to the direction of 
>>>>>>>> Swift.
>>>>>>>> When writing your review, here are some questions you might want to 
>>>>>>>> answer
>>>>>>>> in your review:
>>>>>>>> 
>>>>>>>> * What is your evaluation of the proposal?
>>>>>>>> 
>>>>>>> 
>>>>>>> +1. I'm in agreement with others in this thread who say that the labels 
>>>>>>> are
>>>>>>> parts of the *name* of the function, not parts of its *type*. If I
>>>>>>> understand the other discussions regarding the evolution of Swift's
>>>>>>> function arguments model, the similarity to tuples with labeled 
>>>>>>> components
>>>>>>> is a historical artifact and now merely coincidental.
>>>>>>> 
>>>>>>> The analogy to Objective-C here is obvious, where you have selectors
>>>>>>> instead of functions. The selector is the "name" of the "function" and 
>>>>>>> it
>>>>>>> contains all of the parts, not just the base name.
>>>>>>> 
>>>>>>> Swift function names to me are like German separable verbs. Even when
>>>>>>> they're split across the sentence with multiple words in-between, the
>>>>>>> prefix is still considered part of that verb, not a separate 
>>>>>>> word/concept.
>>>>>>> 
>>>>>>> 
>>>>>>> 
>>>>>>>> * Is the problem being addressed significant enough to warrant a
>>>>>>>> change to Swift?
>>>>>>>> 
>>>>>>> 
>>>>>>> Yes.
>>>>>>> 
>>>>>>> 
>>>>>>> 
>>>>>>>> * Does this proposal fit well with the feel and direction of Swift?
>>>>>>>> 
>>>>>>> 
>>>>>>> Yes. This feels like a natural follow-up to SE-0021, which allowed the 
>>>>>>> use
>>>>>>> of argument names to differentiate between overloads with the same 
>>>>>>> argument
>>>>>>> types at the same positions. To me, this is another admission that the
>>>>>>> labels are part of the function's *name*.
>>>>>>> 
>>>>>>> 
>>>>>>> 
>>>>>>>> * If you have used other languages or libraries with a similar
>>>>>>>> feature, how do you feel that this proposal compares to those?
>>>>>>>> 
>>>>>>> 
>>>>>>> Aside from Objective-C mentioned above, the other languages I've used 
>>>>>>> that
>>>>>>> have named/keyword arguments (like Python) are dynamic languages that 
>>>>>>> treat
>>>>>>> the incoming argument list as a dictionary; in that case, the language
>>>>>>> design is significantly different and I can't draw an analogy between 
>>>>>>> them.
>>>>>>> 
>>>>>>> 
>>>>>>>> * How much effort did you put into your review? A glance, a quick
>>>>>>>> reading, or an in-depth study?
>>>>>>>> 
>>>>>>> 
>>>>>>> Read the proposal and loosely followed the discussion.
>>>>>>> 
>>>>>>> 
>>>>>>>> 
>>>>>>>> More information about the Swift evolution process is available at
>>>>>>>> 
>>>>>>>> https://github.com/apple/swift-evolution/blob/master/process.md
>>>>>>>> 
>>>>>>>> Thank you,
>>>>>>>> 
>>>>>>>> -Chris Lattner
>>>>>>>> Review Manager
>>>>>>>> 
>>>>>>>> 
>>>>>>>> _______________________________________________
>>>>>>>> swift-evolution mailing list
>>>>>>>> swift-evolution-m3fhrko0vlzytjvyw6y...@public.gmane.org
>>>>>>>> https://lists.swift.org/mailman/listinfo/swift-evolution
>>>>>>>> 
>>>>>>> 
>>>>>>> 
>>>>>>> 
>>>>>>> ------------- End Message ------------- 
>>>>>>> 
>>>>>>> 
>>>>>>> 
>>>>>>> From James F
>>>>>>> _______________________________________________
>>>>>>> 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