> On Jun 22, 2016, at 3:14 PM, Jordan Rose <jordan_r...@apple.com> wrote:
> 
>> 
>> On Jun 22, 2016, at 13:05, Matthew Johnson <matt...@anandabits.com 
>> <mailto:matt...@anandabits.com>> wrote:
>> 
>> 
>>> On Jun 22, 2016, at 12:59 PM, Jordan Rose <jordan_r...@apple.com 
>>> <mailto:jordan_r...@apple.com>> wrote:
>>> 
>>>> 
>>>> I would really like to see submodules, but I think there would still be 
>>>> valid uses for `fileprivate` even with them.  But of course we would need 
>>>> to know the details of submodules to have a good discussion about that so 
>>>> it’s a topic for the future. :)
>>>> 
>>>> I wonder what became of this: 
>>>> https://github.com/apple/swift/blob/master/docs/Modules.rst#id18 
>>>> <https://github.com/apple/swift/blob/master/docs/Modules.rst#id18>
>>> As the author of that document, it became clear (or maybe “it became 
>>> murky”) that everyone wants different things from submodules, both for 
>>> compiling their own targets and for importing other people’s targets. I’d 
>>> almost suggest avoiding the word if you want to propose any of myriad 
>>> features related to them:
>> 
>> Interesting.  The reason I like the idea of submodules is because I think 
>> they could accomplish several of these goals with a single feature in a more 
>> elegant manner and without introducing nearly as much complexity as would 
>> likely be present with independent features.  
>> 
>>> 
>>> - importing a subset of APIs
>>> - having APIs not imported by default with the top-level module
>> 
>> Aren’t these kind of duals of each other (subsets of APIs being submodules, 
>> possibly with some APIs directly in the root module)?
> 
> Most Clang submodules allow importing a subset of APIs, but still import 
> everything by default with the top-level module. Explicit submodules are the 
> exception rather than the common case.

That makes sense.

> 
> 
>> 
>>> - C++ namespacing within a module
>> 
>> This is perhaps the most straightforward goal, but I believe it would be 
>> better served by a more robust submodule feature rather than being a limited 
>> namespace feature (for example, integrating with the subset import mentioned 
>> above).
>> 
>>> - C++ namespacing within another module
>> 
>> Can you elaborate?  Do you mean namespaces that are “open to extension” in 
>> any module similar to how we can extend types from imported modules, provide 
>> retroactive conformances, etc?  If that is what you mean I am not at all 
>> convinced there is value in this.
> 
> import Foo
> Foo.Bar.baz()
> 
> It’s not obvious that a namespace within the main module (the module 
> currently being compiled) shouldn’t be flattened when the module is 
> published—say, if things are only broken up for compilation time purposes. 
> Alternately, it’s not obvious that the namespaces within a module match up to 
> the units you want to be able to import as submodules.

This is interesting.  I suppose internal namespaces that are flattened could 
make sense in very large modules.  That is something I hadn’t considered.  It 
feels orthogonal to submodules to me but is certainly related.

> 
> 
>> 
>>> - breaking up compilation units (i.e. not compiling the entire module as 
>>> one unit)
>> 
>> This feels like it could be a build setting independent of submodules.  For 
>> example, if you want WMO to span all submodules you wouldn’t necessarily 
>> want this, but if WMO isn’t important maybe you do.
> 
> People mostly want this for compile time.

Right.  But the ability to make a tradeoff between compile time and runtime 
performance feels more like a build setting of some kind (to me) rather than 
semantics of a language feature.

> 
>> 
>>> - adding another access level between internal and fileprivate.
>> 
>> This obviously makes sense in the context of a submodule (or namespace) 
>> feature, but feels (to me) like it would be awkward as an independent 
>> feature.  
>> 
>>> - adding another access level between fileprivate and private.
>> 
>> Are you thinking of a file that contains scopes from different submodules?  
>> I’m trying to think of how this would do something that the new `private` 
>> wouldn’t already be able to do.
> 
> A few people would prefer to break a file up into (disjoint) groups rather 
> than have groupings across files. I personally think this would not be a good 
> feature, but it goes on the list.

Yes, but I don’t understand why the new `private` wouldn’t accomplish the goal 
access control in this context.  Here’s a strawman example:

submodule Foo {
    private func bar() { … }
    // bar is only visible inside the scope introduced by `submodule Foo`
}

What do you have in mind that wouldn’t be possible given some kind of syntax 
like that?

> 
> 
>> 
>>> - something else?
>> 
>> The big ones IMO are API subsets, namespaces, and encapsulation (access 
>> control) which feel like they fit very nicely together as a single elegant 
>> submodule feature.
> 
> “80% of the users only need 20% of the features, but everybody uses a 
> different 20%”.
> 
> I’d be happy to have one feature that serves multiple purposes; however, in 
> any such proposal I don’t want to take any behavior as obvious, because in 
> the last three years someone has at one point asked for the opposite. :-)

Sure.  You’ve certainly had a lot more experience exploring and discussing this 
area than I have!  :)  

I still think it would be worthwhile to have a community discussion on the 
topic (at the right time of course) and see if we can’t find a balance that is 
workable.

Matthew

> 
> Jordan

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

Reply via email to