This was syntax I initially considered, but Jaden swayed me with the idea that we already have an `extension` keyword so we may as well use it to match the rest of the language. Repeating the `module` declaration also lends itself more to C++-style namespaces, which these are not. I’m not saying it’s out of the question, far from it. It is an alternative we will keep in mind.
~Robert Widmann > On Feb 21, 2017, at 1:53 AM, Psycho Hedgehog via swift-evolution > <swift-evolution@swift.org> wrote: > > The one thing i don't understand is the point of using extensions to extend > modules across multiple files, why not just allow declaring the submodule in > multiple files? > >> Le 20 févr. 2017 à 22:48, Jaden Geller via swift-evolution >> <swift-evolution@swift.org <mailto:swift-evolution@swift.org>> a écrit : >> >> 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 <mailto: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://958D4EFC-6E24-4386-84D4-120E1C2769EC> >>>>>> >>>>>> <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 <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 > > _______________________________________________ > 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