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.

Reply via email to