| ▲ | lerno 4 days ago | ||||||||||||||||
Two reasons, the second being the important: (1) If I read "io.print", is this "the print function in the module io" or "the print method for the variable io". There tends to be an overlap in naming here so that's a downside (2) parsing and semantic checking is much easier if the namespace is clear from the grammar. In particular, C3's "path shortening", where you're allowed to write `file::open("foo.txt")` rather than having to use the full `std::io::file::open("foo.txt")` is only made possible because the namespace is distinct at the grammar level. If we play with changing the syntax because it isn't as elegant as `file.open("foo.txt")`, we'd have to pay by actually writing `std.io.file.open("foo.txt")` or change to a flat module system. That is a fairly steep semantic cost to pay for a nicer namespace separator. I might have overlooked some options, if so - let me know. | |||||||||||||||||
| ▲ | zephen 4 days ago | parent | next [-] | ||||||||||||||||
I have never found either (1) or (2) to be a problem in hundreds of thousands of lines of Python. > In particular, C3's "path shortening" ... we'd have to pay by actually writing `std.io.file.open("foo.txt")` or change to a flat module system. You can easily and explicitly shorten paths in other languages. For example, in Python "from mypackage.mysubpackage import mymodule; mymodule.myfunc()" Python even gracefully handles name collisions by allowing you to change the name of the local alias, e.g. "from my_other_package.mysubpackage import mymodule as other_module" I find the "from .. import" to be really handy to understand touchpoints for other modules, and it is not very verbose, because you can have a comma-separated list of things that you are aliasing into the current namespace. (You can also use "from some_module import *" to bring everything in, which is highly useful for exploratory programming but is an anti-pattern for production software.) | |||||||||||||||||
| |||||||||||||||||
| ▲ | alcover 4 days ago | parent | prev [-] | ||||||||||||||||
> (1) If I read "io.print", is this "the print function in the module io" or "the print method for the variable io" I don't see the issue. Just look up the id ? Moreover, if modules are seen as objects, the meaning is quite the same. > checking is much easier if the namespace is clear from the grammar. Again (this time by the checker) just look up the symbol table ? | |||||||||||||||||
| |||||||||||||||||