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> 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://2ED871CE-7283-4720-945D-299214ADB1B4>
>>>>>  
>>>>> <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
> 
> _______________________________________________
> 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

Reply via email to