Sent from my iPhone
> On Mar 23, 2017, at 6:41 PM, David Hart <da...@hartbit.com> wrote:
>
> I have difficulties imagining a submodule proposal that could allow us to
> eliminate fileprivate. Care to give an example?
The obvious example would be Rust. Rust has exactly two visibilities, and
merely one keyword. By default, members are "private" which is visible inside
the module (so, like Swift's internal). The "public" keyword is similar to
Swift.
The reason this works is that unlike in Swift where a module is something like
a library or framework (Rust calls those "crates"), in Rust modules in are
(explicitly) lexically scoped; a "mod myscope {}" module can be created for the
portion of the file for which the member should be visible and it won't be
visible outside that scope. Likewise, "fileprivate" can be achieved by
enclosing the file in a "mod MyFile {}". And like all lexical scopes, they can
be recursively nested to arbitrary depth to achieve any number of visibility
behaviors (e.g., declare a module for the first half of two files) that would
require complex new keywords to achieve in Swift. Finally there are some
shortcut features like the ability to infer a module structure from the file
system.
In Swift, modules are presently tied to libraries/frameworks in a 1:1 way.
Because of this we lack the flexibility of recursively nestable modules of
other languages and this is the underlying problem that motivates both
scoped/private and fileprivate. If we fixed that, we would actually not need
either keyword.
http://rustbyexample.com/mod/visibility.html
https://doc.rust-lang.org/book/crates-and-modules.html
_______________________________________________
swift-evolution mailing list
swift-evolution@swift.org
https://lists.swift.org/mailman/listinfo/swift-evolution