> On Jan 6, 2016, at 4:52 PM, Howard Lovatt <[email protected]> wrote:
> 
> Here is an expanded proposal for the syntax for a Scala style memberwise 
> syntax and equivalent code, specification is via an example rather than 
> formal syntax since this is easier to follow. Note it is like Scala’s syntax 
> but it is ‘Swiftified” (in particular still retains `init` keyword).
> 
>     class Ex public init(
>         superParam: sPType = sPInitial,
>         private label privateParam: pPType = pPInitial,
>         calculatedParam: cPType = cPInitial
>     ): SuperType(superParam) {
>         calculatedParam: cPType {
>             get {…}
>             set {…}
>         }
>     }
> 
> This gets translated to:
> 
>     class Ex: SuperType(superParam) { {
>         private privateParam: pPType = pPInitial,
>         public init(superParam: sPType = sPInitial, label privateParam: 
> pPType = pPInitial, calculatedParam: cPType = cPInitial) {
>             // 1. Call super
>             super.init(superParam)
>             // 2. Initialize generated parameters and existing parameters
>             self.privateParame = privateParam
>             self.calculatedParam = calculatedParam
>         }
>         calculatedParam: cPType {
>             get {…}
>             set {…}
>         }
>     }

This translation is not valid Swift for several reasons.  There are also 
several aspects of this translation that are somewhat vague and a detailed 
design is necessary to evaluate how you envision it working.

> 
> Because the syntax is so short it is part of this proposal to remove both the 
> current default and memberwise initialisers thus simplifying the language 
> overall (remove two features, add one) and at the same time gain power, which 
> is a rare situation and therefore I would suggest optimal.
> 
> It is also more powerful than the proposed `memberwise init(..)` and/or 
> existing automatic `inits` in the following ways:
> 
> 1. Allows `lets` to have a default value.
> 2. Allows other properties including computed properties to have a default 
> value.
> 3. Allows any `super.init` to be called (not restricted to `super.init()`).
> 4. Allows control of which properties participate in the `init` (they are 
> listed in the brackets and are not in a super call and are not an existing 
> property).
> 5. Allows private properties to be initialised.
> 6. Allows properties including private properties to have a label instead of 
> their actual name and hence not expose internals (also allows migration of 
> implementation whilst retaining external interface).
> 7. Allows calls to the generated `init` that don’t specify all members, i.e. 
> for `struct Ex init(i: Int = 0, s: String = “") {}` the following are allowed 
> `Ex()`, `Ex(i: 1)`, `Ex(s: “A”)`, and `Ex(i: 2, s: “B”)`.
> 8. Allows visibility of automatically generated `init` to be controlled.
> 9. Supports property behaviours.
> 10. Does not require a new keyword.

Several of these points are also true of my proposal and several others would 
be true if what I believe are the most important future enhancements are added. 

> 
> The downsides of the proposal relative to  `memberwise init(..)` and/or 
> existing automatic `inits` are:
> 
> 1. That people would need to be careful when laying out their code otherwise 
> the first line could become long (a bit of pretty printing solves this).
> 2. Existing structs/classes that have automatically generated inits would 
> need to be refactored, e.g. `CGRect` would become `struct CGRect init(var 
> origin: CGPoint, var size: CGSize) {}` (a migration tool would help here).
> 
> Other than the downsides listed above the proposal does everything the 
> current proposal and current implementation does and more (more also listed 
> above) and is simpler to both explain and implement.

This is not true.  There are additional differences.  

> 
> The above more than addresses the reasons given in the current proposal for 
> not using the Scala syntax and demonstrates superiority in many areas.

I disagree.  The current proposal clearly states reasons not addressed here.

I don’t wish to 

> However if it were the current proposal or nothing I would go with the 
> current proposal since something is better than nothing.
> 
> On Wednesday, 6 January 2016, Matthew Johnson <[email protected] 
> <mailto:[email protected]>> wrote:
> 
>> On Jan 5, 2016, at 12:12 PM, Tino Heth <[email protected] 
>> <javascript:_e(%7B%7D,'cvml','[email protected]');>> wrote:
>> 
>> 
>>> The “type parameter list” syntax is sugar that could be implemented as a 
>>> layer on top of the current proposal or could be implemented orthogonally.
>> Hi Howard,
>> I've heard this argument before, so I'll repeat my answer as well:
>> Both offers don't make sense, it's either one way or the other (or something 
>> completely different).
> 
> I don’t think it’s clear whether both make sense or not.  They are not 
> mutually exclusive and are aimed at solving related, but different problems.  
> If we adopt the current proposal, the Kotlin / Scala syntax *might* make 
> sense for some use cases.  It would depend upon whether the current proposal 
> is considered too verbose in enough cases or not.  This may or may not turn 
> out to be the case.
> 
> The reason my proposal looks the way it does is because there are specific 
> goals it intends to achieve and problems it is intended to solve.  These 
> goals and problems are not adequately addressed by the Kotlin / Scala syntax.
> 
>> If diversity starts here, why not have "const" and "val" beside "let", or 
>> allow "fn" and "lambda"?
>> 
>> @Matthew: Please, if you support something, then say so - using clear words, 
>> not phrases like "could be implemented”.
> 
> This phrasing is plenty clear IMO.  I am stating a possibility.  I do not 
> have a position on whether or not it is a good idea at the moment.
> 
> I have made some modifications to the proposal over the last few days.  These 
> changes have been partly motivated by considering the conversation we have 
> had.  You may wish to give it another look.  If so, please look here: 
> https://github.com/anandabits/swift-evolution/blob/flexible-memberwise-initialization/proposals/0018-flexible-memberwise-initialization.md
>  
> <https://github.com/anandabits/swift-evolution/blob/flexible-memberwise-initialization/proposals/0018-flexible-memberwise-initialization.md>.
>   There is currently an open PR for the latest change so it is not in the 
> main Swift evolution repo yet.
> 
> The most recent change includes a discussion of why it does not use the Scala 
> / Kotlin syntax.  You may not like the choice but I hope you can at least 
> understand the rationale (even if you disagree with it).
> 
> 
> 
> 
> -- 
>   -- Howard.
> 

_______________________________________________
swift-evolution mailing list
[email protected]
https://lists.swift.org/mailman/listinfo/swift-evolution

Reply via email to