Oh, I see. You’re questioning the motivation of having scope-granularity submodules at all! My misunderstanding.
I actually hadn’t considered this as added complexity. In my mind, a scoped module declaration seems more Swifty than a file module declaration. It builds on the existing syntax in Swift for defining other sorts of scopes, e.g. types. Cheers, Jaden Geller > On Feb 20, 2017, at 10:41 PM, Jonathan Hull via swift-evolution > <swift-evolution@swift.org> wrote: > > I think my question is: Why do we want to allow submodules that are smaller > than a file? What does that give us to offset the added complexity? > > Thanks, > Jon > >> On Feb 20, 2017, at 6:44 PM, Robert Widmann <devteam.cod...@gmail.com >> <mailto:devteam.cod...@gmail.com>> wrote: >> >> >>> On Feb 20, 2017, at 9:36 PM, Jonathan Hull <jh...@gbis.com >>> <mailto:jh...@gbis.com>> wrote: >>> >>> What is the rational for having modules covering only part of a file? >>> Wouldn’t it be less clutter to have an annotation which worked for the >>> whole file. At the very least it would be nice to have an option to spell >>> it in a way that applies to the whole file. Otherwise, everything will be >>> indented another level. >> >> That is a valid spelling (Rust, IIRC, allows that spelling), but one that is >> easy to miss sitting in a file and makes it confusing to introduce >> submodules. If you include the annotation then define a submodule later >> down in the file, suddenly you have to remember whether you annotated the >> file or whether the submodule you’ve just written is going into the >> top-level module. See: >> >> // -module-name=Foo >> // module Foo { >> module Bar; // Shorthand for “This file defines Foo.Bar” >> >> /* Code */ >> >> // This defines “Foo.Bar.Baz”, but would you know that if it appeared below >> the fold? >> module Baz {} >> //} >> >> If anything, this can be added later if evolution converges on it. >> >>> >>> I would honestly love to see something which just maps modules to >>> folders/groups for simplicity sake. >>> >> >> There is nothing about this scheme that prevents you from organizing your >> code this way. However, modulo that particular method of organization, you >> don’t really gain much as a user of the language by imposing this >> restriction. >> >>> I haven’t thought about it too much yet, so I could easily be missing >>> something obvious... >>> >>> Thanks, >>> Jon >>> >>> >>>> On Feb 20, 2017, at 5:56 PM, Robert Widmann via swift-evolution >>>> <swift-evolution@swift.org <mailto:swift-evolution@swift.org>> wrote: >>>> >>>> Good Evening All, >>>> >>>> Jaden Geller and I have been considering a (sub)module system for Swift >>>> that would complement the existing language but also provide sorely needed >>>> modularity. A draft of the proposal is attached to this email, but it can >>>> also be read as a gist >>>> <https://gist.github.com/CodaFi/cd66b7d70b5cd8e4e8b433fa2ace378a> if you >>>> desire. >>>> >>>> Cheers, >>>> >>>> ~Robert Widmann >>>> >>>> Modular Swift >>>> >>>> Proposal: SE-NNNN <https://gist.github.com/CodaFi/NNNN-filename.md> >>>> Authors: Robert Widmann <https://github.com/codafi>, Jaden Geller >>>> <https://github.com/JadenGeller> >>>> Review Manager: TBD >>>> Status: Awaiting review >>>> >>>> <https://gist.github.com/CodaFi/cd66b7d70b5cd8e4e8b433fa2ace378a#introduction>Introduction >>>> >>>> Almost every major programming language supports some form of modular >>>> programming through constructs like (sub)modules, packages, or interfaces. >>>> Swift, though it provides top-level modules to organize code under, does >>>> not provide a complete implementation of any of these concepts, which has >>>> led instead to the proliferation of access control levels. This has not >>>> proven an effective way to decompose programs into manageable parts, and >>>> exposes the need for a real system of modules to solve this modularity >>>> problem once and for all. >>>> >>>> Separation of code into distinct islands of functionality should be a >>>> first-class construct in the language, not dependent on external files and >>>> tools or filesystems. To that end, we propose the introduction of a >>>> lightweight module system for Swift. >>>> >>>> Swift-evolution thread >>>> <applewebdata://6211E639-228B-457B-B598-8F026C4DC4FA> >>>> >>>> <https://gist.github.com/CodaFi/cd66b7d70b5cd8e4e8b433fa2ace378a#motivation>Motivation >>>> >>>> Swift has reached a point in its evolution where rich libraries and large >>>> projects that take on many dependencies have matured significantly. To >>>> accomodate the information-hiding and semantics-signalling needs of these >>>> users at the time, Swift began its access control story with just three >>>> access modifiers: public, private, and internal then grew fileprivate and >>>> open as the need to express locality of implementation and >>>> "subclassability" arose respectively. In doing so, Swift's access control >>>> scheme has become anti-modular. >>>> >>>> >>>> <https://gist.github.com/CodaFi/cd66b7d70b5cd8e4e8b433fa2ace378a#proposed-solution>Proposed >>>> solution >>>> >>>> We propose the introduction of a lightweight module system for Swift. More >>>> than simply namspaces, a module declaration interacts with Swift's access >>>> control to provide an API boundary that allows better control over an >>>> interface's design. >>>> >>>> >>>> <https://gist.github.com/CodaFi/cd66b7d70b5cd8e4e8b433fa2ace378a#detailed-design>Detailed >>>> design >>>> >>>> >>>> <https://gist.github.com/CodaFi/cd66b7d70b5cd8e4e8b433fa2ace378a#syntax>Syntax >>>> >>>> A module is a named region that introduces a lexical scope into which >>>> declarations may be nested. The name of the module can be used to access >>>> these member declarations. A module, like other aggregate structures in >>>> Swift, may be extended with new declarations over one or more translation >>>> units (files). >>>> >>>> We propose a new declaration kind, module-decl be added to the language. A >>>> proposed grammar using the new modulekeyword is given below: >>>> >>>> GRAMMAR OF A MODULE DECLARATION >>>> >>>> module-declaration -> `module` module-identifier module-body >>>> module-name -> identifier >>>> module-body -> { module-members(opt) } >>>> module-members -> module-member module-members(opt) >>>> module-member -> declaration | compiler-control-statement >>>> GRAMMAR OF A DECLARATION >>>> >>>> + declaration -> module-declaration >>>> >>>> <https://gist.github.com/CodaFi/cd66b7d70b5cd8e4e8b433fa2ace378a#general-semantics>General >>>> Semantics >>>> >>>> Syntax and semantics for imports, as it already supports referencing >>>> submodules imported from C and Objective-C modules, remains unchanged: >>>> >>>> // The outermost module is given explicitly >>>> // by passing `-module-name=Foo` or exists implicitly, as today. >>>> // module Foo { >>>> public class A {} >>>> >>>> module Bar { >>>> module Baz { >>>> public class C {} >>>> } >>>> >>>> public class B {} >>>> } >>>> >>>> let message = "Hello, Wisconsin!" >>>> // } // End declarations added to module Foo. >>>> To consume this interface: >>>> >>>> // imports all of Foo, Foo.Bar, and Foo.Bar.Baz >>>> import Foo.Bar.Baz >>>> >>>> // imports Foo.A as A >>>> import class Foo.A >>>> // imports Foo.Bar.B as B >>>> import class Foo.Bar.B >>>> // imports Foo.Bar.Baz.C as C >>>> import class Foo.Bar.Baz.C >>>> A module declaration may only appear as a top-level entity or as a member >>>> of another module declaration. The following code is therefore invalid: >>>> >>>> module Foo { >>>> class Bar { >>>> module Baz {} // error: module declaration cannot be nested inside >>>> type 'Bar' >>>> } >>>> } >>>> To extend an existing module declaration, simply reference its module name >>>> in an extension declaration. >>>> >>>> // In module 'Foo' >>>> module Bar { >>>> public class A {} >>>> >>>> module Baz {} >>>> } >>>> >>>> extension Bar { >>>> public struct B {} >>>> } >>>> >>>> extension Bar.Baz { >>>> public enum C { case D } >>>> } >>>> >>>> <https://gist.github.com/CodaFi/cd66b7d70b5cd8e4e8b433fa2ace378a#modules-and-access-control>Modules >>>> and Access Control >>>> >>>> The semantics of some existing access control modifiers shall also be >>>> extended to support module declarations: >>>> >>>> open and public declarations are exported by a module for consumption by >>>> clients of the module. >>>> internal declarations scope over the entire module and any derived >>>> submodules. >>>> By default, to preserve encapsulation of interfaces, modules are "sealed" >>>> and may only be "opened" by explicit named import. However, it is often >>>> desirable to export a module and a set of submodules or even modules from >>>> external dependencies along with a given interface. We propose the public >>>> keyword be used for this purpose: >>>> >>>> // Defines top-level module "Foo" >>>> //module Foo { >>>> public import Foo.Bar.Baz >>>> public import Foundation.Date >>>> //} >>>> Which then causes the following (sub)modules to be imported into scope >>>> along with Foo: >>>> >>>> // imports Foo, Foo.Bar.Baz, and Foundation.Date >>>> import Foo >>>> To support existing Swift packages that cannot have opted into modules, >>>> and to preserve the scriptable nature of Swift, module declarations shall >>>> be optional. Any Swift program that does not declare at least one >>>> top-level module explicitly is considered part of an unnamed special >>>> "Global Module" with the same rules of access control as today. To give >>>> declarations in the Global Module an explicit module without using a >>>> module declaration, use the -module-name flag. >>>> >>>> >>>> <https://gist.github.com/CodaFi/cd66b7d70b5cd8e4e8b433fa2ace378a#impact-on-existing-code>Impact >>>> on Existing Code >>>> >>>> This proposal is intentionally additive. There is no impact on existing >>>> code. >>>> >>>> >>>> <https://gist.github.com/CodaFi/cd66b7d70b5cd8e4e8b433fa2ace378a#alternatives-considered>Alternatives >>>> considered >>>> >>>> >>>> <https://gist.github.com/CodaFi/cd66b7d70b5cd8e4e8b433fa2ace378a#explicit-modules-everywhere>Explicit >>>> Modules Everywhere >>>> >>>> Declarations in the top-level of a program exist today in the top-level of >>>> the corresponding module. If desired, this module declaration could be >>>> required to be explicit like so: >>>> >>>> module Foo { >>>> module Bar { >>>> module Baz {} >>>> } >>>> } >>>> However, we feel that imposing such a requirement not only complicates the >>>> outermost scope, it requires inserting needless extension Foo {} scopes in >>>> every file. It also violates the principle of progressive disclosure by >>>> forcing all new adoptees of Swift to learn what a module is without >>>> actually using the module system. >>>> >>>> >>>> <https://gist.github.com/CodaFi/cd66b7d70b5cd8e4e8b433fa2ace378a#nested-extensions>Nested >>>> Extensions >>>> >>>> Nested module extensions may be "expanded" as it were to the following: >>>> >>>> module Foo { >>>> module Bar {} >>>> } >>>> >>>> extension Foo { >>>> extension Bar {} >>>> } >>>> However, this syntax is currently not enabled in general in Swift. This >>>> problem should be revisted in a future proposal. >>>> >>>> >>>> <https://gist.github.com/CodaFi/cd66b7d70b5cd8e4e8b433fa2ace378a#deprecations-source-breaking-changes>Deprecations >>>> (Source-Breaking Changes) >>>> >>>> The system described above is intended to be entirely source and binary >>>> compatible. Nonetheless, in its design we feel we have obviated certain >>>> existing features and recommend their deprecation in future proposals: >>>> >>>> fileprivate access can be recreated by creating a private "utility >>>> submodule" containing declarations of at least internal access. >>>> @_exported, the private directive to re-export modules today, should be >>>> deprecated and removed. >>>> >>>> _______________________________________________ >>>> 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
_______________________________________________ swift-evolution mailing list swift-evolution@swift.org https://lists.swift.org/mailman/listinfo/swift-evolution