> On Jun 14, 2017, at 4:45 AM, Jérémie Girault <jeremie.gira...@gmail.com> 
> wrote:
> @john, the proposal is the fruit of my imagination and the goal was to 
> discuss about it.
> I’m vastly open to change it with the help of anyone if it can be implemented 
> in a simple way and leads to better compatibility or syntactical improvements.
> 
> xiaodi told me that he wouldn’t be available to help me but I’m open to any 
> help and change that would represent an improvement (from the developer or 
> compiler point of view)

I'm just providing feedback.

John.

> 
> —
> very short reply expected - vsre.info <http://vsre.info/>
> Jérémie Girault
> 
> On 13 juin 2017 at 19:15:18, John McCall (rjmcc...@apple.com 
> <mailto:rjmcc...@apple.com>) wrote:
> 
>> 
>>> On Jun 13, 2017, at 4:41 AM, Xiaodi Wu <xiaodi...@gmail.com 
>>> <mailto:xiaodi...@gmail.com>> wrote:
>>> 
>>> On Tue, Jun 13, 2017 at 3:06 AM, John McCall <rjmcc...@apple.com 
>>> <mailto:rjmcc...@apple.com>> wrote:
>>>> On Jun 13, 2017, at 3:30 AM, Jérémie Girault <jeremie.gira...@gmail.com 
>>>> <mailto:jeremie.gira...@gmail.com>> wrote:
>>>> 
>>>> Exactly, 
>>>> The reflexion behind it is: 
>>>> 
>>>> - Let's understand that 0110 and other tuple SE are important for the 
>>>> compiler, we do not want them to rollback
>>>> - However we have number of regressions for generics / functional 
>>>> programmers
>>>> - Let’s solve this step by step like a typical problem
>>>> 
>>>> - Step 0 is adressing this Void tuple of size zero :
>>>> - Zero is in many problems of CS an edge case, so let’s handle this case 
>>>> first
>>>> - The compiler knows what Void is, and its only value (or non-value)
>>>> - It was handled historically by the compiler because of implicit side 
>>>> effects
>>>> - Let’s handle it explicitely with rules in current context
>>>> - one effect of the proposal is source compatibility
>>>> - but the goal is to build atop and strengthen 0110, 0066 and other 
>>>> tuple-related SE
>>>> 
>>> 
>>> There are four difficulties I see with this proposal.
>>> 
>>> The first is that it is a first step that quite clearly does not lead to 
>>> anything.  It resolves a difficulty with exactly one case of function 
>>> composition, but we would need completely different solutions to handle any 
>>> of the other compositional regressions of SE-0110.
>>> 
>>> The second is that it's a huge source of complexity for the type system.  
>>> The type checker would not be able to do even rudimentary type matching, 
>>> e.g. when checking a call, without having first resolved all of the 
>>> argument and parameter types to prove that they are not Void.  This would 
>>> probably render it impossible to type-check many programs without some 
>>> ad-hoc rule of inferring that certain types are not Void.  It would 
>>> certainly make type-checking vastly more expensive.
>>> 
>>> The third is that it is not possible to prevent values of Void from 
>>> existing, because (unlike Never, which cannot be constructed) they are 
>>> always created by returning from a Void-returning function, and a generic 
>>> function can do anything it likes with that value — turn it into an Any, 
>>> store it in an Array, whatever.  The proposal seems to only consider using 
>>> the value as a parameter.
>>> 
>>> Hang on, though. If Jérémie is interested only in addressing the issue of 
>>> Void as a parameter and his idea can be adequately carried out by inferring 
>>> a default value of Void for every parameter of type Void, this should be a 
>>> fairly self-contained change, should it not? And would the impact on the 
>>> cost of type checking really be vastly greater in that case?
>> 
>> If the proposal was phrased in terms of defaults, e.g. "trailing parameters 
>> do not require a matching argument if they have Void type", then yes, that 
>> would be implementable because it still admits a "local" reduction on call 
>> constraints, one which does not need to immediately reason about the actual 
>> types of arguments.  It is not clear that this rule allows function 
>> compositions of the sort that Jérémie is looking for, though.
>> 
>> Anyway, that is not the proposal; the proposal is that parameters — in any 
>> position — are simply removed from the parameter sequence if they have Void 
>> type.  In order to allow composition (i.e. f(g(x)), where g: X -> Void), you 
>> then need a matching rule that arguments are dropped from the argument 
>> sequence (for purposes of type-checking) if they have Void type.  Either of 
>> these rules is sufficient to turn the reduction of function-type matches 
>> into an extremely messy combinatoric matching problem where e.g. (τ0, Int) 
>> can be passed to a function taking (Int, τ1) if we can decide that τ0 == τ1 
>> == Void.
>> 
>>> This idea is now rather intriguing to me because it extends beyond just 
>>> addressing one symptom of SE-0110. Swift allows us to omit the spelling out 
>>> of return types that are Void, it allows warning-free discarding of return 
>>> values that are Void, etc. This could add a nice consistency and 
>>> rationalize some of the weirdness of passing a value that is stipulated by 
>>> the parameter type.
>>> 
>>> Finally, it would allow a lot of inadvertent errors with the use of generic 
>>> functions, because any argument of unconstrained type could be accidentally 
>>> specialized with Void.  For example, if you forgot to pass an argument to 
>>> this function, it would simply infer T=Void:
>>>   func append<T>(value: T)
>>> It seems more likely that this would lead to unexpected, frustrating bugs 
>>> than that this would actually be desired by the programmer.  You really 
>>> just want this to kick in in more generic situations.
>>> 
>>> Hmm, at first glance, that seemed like it could be bad. But if, say, a 
>>> particular collection can store an element of type Void, is it so 
>>> undesirable to allow `append()` to append Void?
>> 
>> append on a Collection is not an unconstrained generic; its parameter type 
>> is determined by the type of the collection.  Perhaps this was a 
>> poorly-chosen example.
>> 
>> John.
>> 
>>> 
>>> 
>>> John.
>>> 
>>>> 
>>>> —
>>>> very short reply expected - vsre.info <http://vsre.info/>
>>>> Jérémie Girault
>>>> 
>>>> On 13 juin 2017 at 00:44:52, Xiaodi Wu (xiaodi...@gmail.com 
>>>> <mailto:xiaodi...@gmail.com>) wrote:
>>>> 
>>>>> On Mon, Jun 12, 2017 at 5:38 PM, Xiaodi Wu <xiaodi...@gmail.com 
>>>>> <mailto:xiaodi...@gmail.com>> wrote:
>>>>> On Mon, Jun 12, 2017 at 5:25 PM, Jérémie Girault 
>>>>> <jeremie.gira...@gmail.com <mailto:jeremie.gira...@gmail.com>> wrote:
>>>>> 
>>>>> 
>>>>> —
>>>>> very short reply expected - vsre.info <http://vsre.info/>
>>>>> Jérémie Girault
>>>>> 
>>>>> On 12 juin 2017 at 23:56:37, Xiaodi Wu (xiaodi...@gmail.com 
>>>>> <mailto:xiaodi...@gmail.com>) wrote:
>>>>> 
>>>>>> On Mon, Jun 12, 2017 at 4:47 PM, Jérémie Girault 
>>>>>> <jeremie.gira...@gmail.com <mailto:jeremie.gira...@gmail.com>> wrote:
>>>>>> - Void as arguments is pretty common when using generics, that’s a core 
>>>>>> point of this proposal. An maybe that’s why we misunderstood ourselves 
>>>>>> (around 0110 / 0066). This proposal addresses arguments.
>>>>>> - maybe it should be revised around this ? Simple example : 
>>>>>> 
>>>>>> `typealias Callback<T> = (T) -> Void` -> `Callback<Void>` will give 
>>>>>> `(Void) => Void`. 
>>>>>> 
>>>>>> It was acceptable before swift4 but no more. However nobody cares about 
>>>>>> this `Void` argument and actually we know it’s value. So why let the 
>>>>>> developer type it ?
>>>>>> 
>>>>>> Ah, I see. The purpose of SE-0029...SE-0110 was to make it possible to 
>>>>>> distinguish an argument list `(Void)` from an argument list `()`. This 
>>>>>> does cause some verbosity where previously users relied on implicit 
>>>>>> tuple splatting. Ideally, we would bring back some syntactic sugar to 
>>>>>> make this more ergonomic. But, whether or not the spelling is made more 
>>>>>> user-friendly, the point here is that _everybody_ should care about this 
>>>>>> `Void` argument.
>>>>> 
>>>>> It is still be typechecked and appropriate errors should be reported to 
>>>>> the user so _nobody_ will ignore it.
>>>>> 
>>>>> But with the proposal the code will be striped out of Void arguments at 
>>>>> compile-time. I think it's a win for the developer on a lot of grounds. 
>>>>> The fact that this proposal integrates with the type-system is also 
>>>>> important.
>>>>> 
>>>>> If you are not comfortable about Void being stripped, we can also discuss 
>>>>> alternatives: someone was suggesting me that it would be possible to 
>>>>> replace :
>>>>> 
>>>>> ```
>>>>> 
>>>>> func foo<T, U, V>(t: T, u: U) -> V {
>>>>> 
>>>>>   // do something with t and u
>>>>> 
>>>>>   // return some V
>>>>> 
>>>>> }
>>>>> 
>>>>> ```
>>>>> 
>>>>> with
>>>>> 
>>>>> ```
>>>>> 
>>>>> func foo<Void, Int, String>(u: Int) -> String { let t = ()
>>>>> 
>>>>>   // do something with t and u
>>>>> 
>>>>>   // return some V
>>>>> 
>>>>> }
>>>>> 
>>>>> ```
>>>>> 
>>>>> or
>>>>> 
>>>>> ```
>>>>> 
>>>>> func foo<Void, Int, String>(t: Void = (), u: Int) -> String {
>>>>> 
>>>>>   // do something with t and u
>>>>> 
>>>>>   // return some V
>>>>> 
>>>>> }
>>>>> 
>>>>> ```
>>>>> 
>>>>> I don’t know what you would consider more effective or elegant (at an 
>>>>> implementation level) but it’s the same result for the developper.
>>>>> 
>>>>> 
>>>>> Ah, but I think I catch your drift with the last example. Is this a more 
>>>>> general point that the compiler should treat every parameter of type Void 
>>>>> as having an implied default value of Void? That would be an interesting 
>>>>> idea.
>>>>> 
>>>>> What is the goal of such changes? Is it to allow you to write `foo()` 
>>>>> instead of `foo(())` for a function `foo` of type `(T) -> Void`?
>>>>> 
>>>>> If so, then I think what you're seeking to do is reverse SE-0066 (as 
>>>>> Vladimir points out), which explicits details how it's is an intentional 
>>>>> change to require such a spelling. I think you're starting from the 
>>>>> premise that this is unintended or undesirable, when in fact it is 
>>>>> deliberate and approved.
>>>>> 
>>>>> It is also, unless I'm mistaken, not the issue that was raised initially 
>>>>> with respect to SE-0110, which had to do with the extra boilerplate of 
>>>>> destructuring a tuple inside a closure, something that was not so obvious 
>>>>> before implementation.
>>>>> 
>>>>>> My point here is that `Void` should be “striped” by “reducing” argument 
>>>>>> list signatures.
>>>>>> 
>>>>>> —
>>>>>> very short reply expected - vsre.info <http://vsre.info/>
>>>>>> Jérémie Girault
>>>>>> 
>>>>>> On 12 juin 2017 at 19:15:18, John McCall (rjmcc...@apple.com 
>>>>>> <mailto:rjmcc...@apple.com>) wrote:
>>>>>> 
>>>>>>> 
>>>>>>>> On Jun 12, 2017, at 4:48 AM, Jérémie Girault via swift-evolution 
>>>>>>>> <swift-evolution@swift.org <mailto:swift-evolution@swift.org>> wrote:
>>>>>>>> 
>>>>>>>> Hi here,
>>>>>>>> 
>>>>>>>> As I tested swift4 in xcode9b1 I noticed a lot of regressions about 
>>>>>>>> tuples usage.
>>>>>>>> 
>>>>>>>> After documenting myself about the changes which happened, I thought 
>>>>>>>> that they could be improved. Instead of fighting these propositions 
>>>>>>>> (which make sense), I wanted create a few proposal which would improve 
>>>>>>>> these recent changes with a few simple rules.
>>>>>>>> 
>>>>>>>> My propositions are based on the recent decisions and in the 
>>>>>>>> continuation of SE-0110. The first one is about Void.
>>>>>>>> Void is historically defined as the type of the empty tuple. The 
>>>>>>>> reason of this is that arguments were initially considered as tuple.
>>>>>>> 
>>>>>>> The dominant consideration here was always return types, not 
>>>>>>> parameters.  I'm not sure there was ever much point in writing Void in 
>>>>>>> a parameter list, but whatever reasons there were surely vanished with 
>>>>>>> SE-0066.
>>>>>>> 
>>>>>>> Note that 'void' in C was originally exclusively a return type.  ANSI 
>>>>>>> gave it a new purpose it with void*, but the meaning is totally 
>>>>>>> unrelated.
>>>>>>> 
>>>>>>> John.

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

Reply via email to