On 12/21/2013 10:22 PM, H. S. Teoh wrote:
I was pretty upset when I encountered the following situation:
---std/regex.d---
...
private struct Stack { ... }
...
---mymodule.d---
...
/* public */ struct Stack { ... }
...
---main.d---
import std.regex;
import mymodule;
Stack s; // compile error: 'Stack' is ambiguous
I find it unacceptable that introducing a *private* symbol to std.regex
will break existing code (std.regex.Stack wasn't there in earlier
versions of Phobos). Since std.regex.Stack is private, why would it even
be in *any* overload set when compiling main.d??! This is leaky
abstraction at its best: changing the implementation of a module without
changing its API can randomly break user code due to newly-introduced
private symbols clashing with user-defined symbols.
Yes, this is the big issue that we try to address with DIP22.
Happened to me too when I added a private `abs` helper to core.time
which then caused conflicts somewhere else in phobos.