@icedquinn @shrimp The constant.module.prefixing() seen in other languages is grotesque::and::unnecessary::visual::bloat().
C++ is sane-ish with "using namespace foo;", though few seem to use it. You can use "import * from foo" in some other languages too, but at that point you have the same annoyance as a header file, without the ability to reasonably control it at compile time with pre-declared macros, nor the ability to usefully *-import two modules with conflicting names, which they will have because people assume::you're::prefixing::everything so it's perfectly reasonable to make a top-level.function.called.copy() in every other module.
Another big problem with "modules" as a concept is that they aren't very flexible. They're monolithic. Either you break things apart into different modules, or they share namespaces, or you manually cherry-pick things. Into every file. You can't include just part of one or only some functions by only including "part" of the module. Headers merely inform the compiler about which functions and structs and global variable will be available from somewhere else so don't worry about it just compile this code and leave the rest to the linker. You can mix and match this however you want.
Remember, #include is part of the preprocessor, something which very few modern languages have. Headers also sequentially bring along their macros, which are extremely powerful.