Bill Baxter: >I think this problem you refer to only applies to modules without package >names. I.e. "module Foo" containing "class Foo". Things seem to work ok if >you have "module x.Foo" with "class Foo" inside.<
Right. But why settle with a half-backed module system when there are more logic ways to design it? :-) > So you are saying you want this to be an error? > > import std.string; > void foo() { > std.string.format("hi"); // error no such symbol "std.string" > format("hi"); // ok > } The following examples show what I mean: import std.string; void foo() { std.string.format("hi"); // OK, "std.string" name exists in the current scope. format("hi"); // Error, "format" name is absent. } import std.string: format; void foo() { std.string.format("hi"); // Error, "std" name is absent. format("hi"); // OK. } import std.string: *; void foo() { std.string.format("hi"); // Error, "std" name is absent. format("hi"); // OK, all names inside "std.string" are now present in the current scope. } import std.string; import std.string: format; void foo() { std.string.format("hi"); // OK. format("hi"); // OK. } This doesn't solve all problems, but it's a good step toward improving the situation. >auto x = new Foo; // Foo.Foo should not be needed if class Foo is the only >thing inside Foo.< That's a special casing, it may look handy, but it may also lead to troubles later. So I think it's better to keep things tidy, and avoid that. D allows enough things (renamed imports, alias, and selective imports) to solve such problems already. > template AReallyLongTemplateNameIDontWannaTypeTwice(T) { > void this(T x) { } > } You can write that in D1 as: void aReallyLongTemplateNameIDontWannaTypeTwice(T)(T x) { } >I love how I don't have to change all the constructor names in D whenever I >change a class name.< I agree, but for example when you define a opCmp of a struct you have to do: struct Foo { int x; int opCmp(Foo other) { ... As you can see the name Foo is repeated two times, and I don't like that much (I don't use an IDE able to refractor names). In D1 I sometimes solve that small problem like this: struct Foo { int x; int opCmp(typeof(*this) other) { ... Or like this: struct Foo { int x; alias typeof(*this) TyThis; int opCmp(TyThis other) { ... Bye, bearophile