> On Apr 8, 2017, at 4:12 PM, Xiaodi Wu <xiaodi...@gmail.com> wrote:
> 
> On Fri, Apr 7, 2017 at 11:34 PM, John McCall via swift-evolution 
> <swift-evolution@swift.org <mailto:swift-evolution@swift.org>> wrote:
> 
> > On Apr 7, 2017, at 8:12 PM, Jakub Suder via swift-evolution 
> > <swift-evolution@swift.org <mailto:swift-evolution@swift.org>> wrote:
> >
> > > What is your evaluation of the proposal?
> >
> > If this is the last option we have to change the status quo, any renaming 
> > is off the table, no further changes after Swift 4, and it's either this or 
> > being stuck with 'fileprivate' until the end of time, then +1 from me. It 
> > will increase the convenience of access control for people like me who see 
> > types and their extensions as parts of the same entity, just spread 
> > visually across neighboring blocks. In almost any other language these two 
> > would indeed be one entity, since most languages don't have any way of 
> > dividing types into pieces this way.
> >
> > However, IMHO any of these would be a better solution:
> 
> I'd like to respond briefly to this to clarify the Core Team's decisions 
> about what solutions are under consideration, both now and in the future.  By 
> doing this, I don't mean to pressure you towards any particular stance.  The 
> Core Team asked for this to be proposed because we wanted to know how the 
> community felt about it; we are not specifically trying to get it approved, 
> at least as a group.
> 
> > 1) Rename 'private' to something else ('scoped'?) and rename 'fileprivate' 
> > back to 'private'
> 
> The Core Team has rejected making such a major change in the interpretation 
> of 'private'.  'private' will be tied to scopes, now and forever.  The only 
> question is whether extensions of the same type within a file should be 
> considered part of the same scope for the purposes of 'private'.  Swift 4 is 
> the deadline for making that change; if it, too, is rejected, 'private' will 
> be purely lexical forever.
> 
> > 2) Rename 'fileprivate' to something more friendly (I liked the 'local' 
> > suggestion that Vladimir made today)
> 
> The Core Team is willing to consider adding a new keyword to replace 
> 'fileprivate', but not in Swift 4.
> 
> Speaking just for myself, I don't think we'd accept such a change purely for 
> aesthetics;
> 
> If I recall correctly, Chris in post-review discussions communicated that a 
> new keyword to replace `fileprivate` would be considered if `fileprivate` 
> turned out to be commonly used enough to be aesthetically problematic?

Yes.  We would consider it.  Chris probably believes that we're more likely to 
accept that change than I do; that's why I was careful to say that I was just 
speaking for myself.  (Chris didn't need to say that explicitly in his message 
because he wasn't explicitly speaking for the Core Team in other parts.)

> I bring this up because, in replying to BJ Homer, it occurs to me that there 
> is an interesting solution. If--as I understand--successive access modifiers 
> being supersets of preceding ones is a non-negotiable part of the design, 
> then type-based access modifiers cannot be accommodated in Swift because of 
> the existence of extensions. Ergo, the word "protected" cannot ever be used 
> to mean what it does in C++, etc. It is a perfectly nice word that by its 
> dictionary meaning is plausibly intermediate between "private" and 
> "internal," which we can repurpose to mean protected by the end of file! By 
> co-opting this word, it has the key virtue of definitively demonstrating that 
> Swift cannot and will not support access modifiers that are tied to types.

I wouldn't say that successive access modifiers being supersets of existing 
ones is a part of the design.  We've been reluctant to change *existing* 
modifiers in ways that aren't just weakening them, but that's different.

That said, "protected" is a pretty valuable keyword, and there have been 
several other interesting proposals for it, especially for things that lie on 
the other side of "internal".  I wouldn't want to burn "protected" until we've 
gotten a complete enough picture of what access problems library developers are 
having that we're sure it's not more useful there.

John.


> 
> it would have to be because 'fileprivate' seemed inappropriate for some new 
> generalization, e.g. if we added sub-file submodules and wanted 'fileprivate' 
> to allow access only within the submodule.  That is assuming a lot about how 
> a future submodule feature would work, and we aren't going to design that 
> feature specifically with a goal of replacing this keyword, and frankly we 
> don't know when we're going to take that on at all.  I would caution people 
> against assuming that 'fileprivate' will be renamed.
> 
> > 3) Postpone this until we add submodules, but with the assumption that it 
> > will be possible to make some source-breaking changes at that point
> 
> The Core Team is not willing to change the basic design of 'private' in 
> future releases of Swift.  If some feature — perhaps submodules — demands 
> that we define its interaction with 'private', the design of that interaction 
> will have to feel natural and consistent with the at-that-point extant design 
> of 'private'.  For example, it would not be acceptable if, say, adding a 
> submodule declaration to a file suddenly changed the interpretation of 
> 'private'.
> 
> An option (4) that you didn't list but which I should cover for completeness 
> would be to add new keywords in the future with new interpretations.  This is 
> something that the Core Team is willing to consider.  However, speaking just 
> for myself again, I find it unlikely that we would add new access control 
> features just to express increasingly-precise refinements; it would have to 
> be something that felt necessary because of some real inadequacy in the 
> existing access-control levels as applied to some other new feature (e.g. 
> submodules).
> 
> John.
> 
> > The thing I don't like about this proposal (or status quo) - apart from the 
> > fact that it will make people who like the current strict private unhappy - 
> > is that 'private' even right now means kind of two different things:
> >
> > - for a property or a method defined in a class/struct, it means "available 
> > only inside this type"
> > - for a private global variable/constant/function, or a private type or 
> > extension, it means "available in this file" i.e. the same as 'fileprivate'
> >
> > So if we're worried that this proposal makes the meaning of 'private' 
> > unclear - it already is unclear. Wouldn't it be much more clear if private 
> > global variables, functions and classes were required to use the access 
> > level that means "available in this file", since that's how they actually 
> > work? (as long as this level is not named 'fileprivate' :)
> >
> > And the other access level, the "available only inside this type" (private 
> > / scoped), could only be used for things that are actually contained inside 
> > a type, and wouldn't have two different meanings depending on whether it's 
> > at the root of the file or nested inside something else.
> >
> > I really believe that even though this is kind of painful for everyone, 
> > it's worth spending time to figure out a solution that satisfies most of us 
> > and makes the language clearer and friendlier in the long term, even if it 
> > means breaking compatibility again. Do we want to be stuck with an 
> > imperfect solution 10 years from now, because we didn't want to do this 
> > last breaking change now?
> >
> >
> > > Is the problem being addressed significant enough to warrant a change to 
> > > Swift?
> >
> > I think almost everyone here agrees it is significant.
> >
> >
> > > Does this proposal fit well with the feel and direction of Swift?
> >
> > This is a difficult question. IMHO it would definitely fit much better with 
> > the direction of Swift if we bit the bullet and did whatever we agree will 
> > make the language simpler and better long term, regardless how many changed 
> > lines in git this will cause when Swift 4 is released.
> >
> >
> > > If you have used other languages or libraries with a similar feature, how 
> > > do you feel that this proposal compares to those?
> >
> > I've used many languages, but I think in none of them it was a common thing 
> > (or even a possibility) to split types into several blocks like we do in 
> > Swift with extensions, so the main issue we're talking about didn't exist 
> > there. In Ruby you can kind of do the same thing with modules - if you have 
> > a private method in a module, you can access it from methods in the main 
> > type, even if they're defined in a different file. (But Ruby isn't very 
> > strict about access control in general, e.g. it allows you to call private 
> > methods on any object via #send).
> >
> >
> > > How much effort did you put into your review? A glance, a quick reading, 
> > > or an in-depth study?
> >
> > I've read or skimmed through most of the messages in the recent threads 
> > about this and the last proposal.
> >
> > Disclaimer: I have very little experience with Swift 3 (but plenty with 
> > Swift 2.x).
> >
> > Kuba
> >
> > _______________________________________________
> > 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

Reply via email to