On Wednesday, 17 June 2015 at 09:28:00 UTC, Tofu Ninja wrote:

I actually thought about it more, and D does have a bunch of binary operators that no ones uses. You can make all sorts of weird operators like +*, *~, +++, ---, *--, /++, ~~, ~-, -~,
>>>--, &++, ^^+, in++, |-, %~, ect...

void main(string[] args){
        test a;
        test b;
        a +* b;
}
struct test{
        private struct testAlpha{
                test payload;
        }
        testAlpha opUnary(string s : "*")(){
                return testAlpha(this);
        }
        void opBinary(string op : "+")(test rhs){
                writeln("+");
        }
        void opBinary(string op : "+")(testAlpha rhs){
                writeln("+*");
        }
}

Oh right, meant to respond to this. I'll admit it took me a few to really get why that works-- it's fairly clever and moderately terrifying. (I showed it to a friend and he opined it may violate the grammar.)

But playing with it a bit...well, it's very cumbersome having to do these overload gymnastics. It eats away at your opUnary space because of the need for private proxy types, and each one needs an opBinary defined to support it explicitly. It also means you can't make overloads for mismatched types or builtin types (at least, I couldn't figure out how in the few minutes I spent poking it over lunch).

-Wyatt

Reply via email to