This is exactly the approach I'm planning on for my own language.
I have a 3-way split:
1) core.* - basic support things like builtin traits, etc; this is the only namespace/prefix that is "special" to the compiler
2) std.* - things you might see in a minimalist stdlib. String manipulation, some useful algorithms, math, etc.
3) etc.* - technically part of the package ecosystem, but officially supported. All the usual suspects like advanced I/O, networking, base64, and whatnot would be found here. Making it part of the package management means it can be versioned independently from the compiler and in principle even broken between major versions (not that I'm planning to, but design mistakes happen)
I have a 3-way split:
1) core.* - basic support things like builtin traits, etc; this is the only namespace/prefix that is "special" to the compiler
2) std.* - things you might see in a minimalist stdlib. String manipulation, some useful algorithms, math, etc.
3) etc.* - technically part of the package ecosystem, but officially supported. All the usual suspects like advanced I/O, networking, base64, and whatnot would be found here. Making it part of the package management means it can be versioned independently from the compiler and in principle even broken between major versions (not that I'm planning to, but design mistakes happen)
(Exact name of "core" TBD)