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> 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://4C05112E-CB0F-4EA2-93D5-BF8C6BD617E3>
>>>  
>>> <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

Reply via email to