DIP80: phobos additions
Tofu Ninja via Digitalmars-d
digitalmars-d at puremagic.com
Wed Jun 24 14:41:17 PDT 2015
On Wednesday, 24 June 2015 at 19:04:38 UTC, Wyatt wrote:
> 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
I am thinking of writing a mixin that will set up the proxy for
you so that you can just write.
struct test
{
mixin binOpProxy("*");
void opBinary(string op : "+*", T)(T rhs){
writeln("+*");
}
}
The hard part will be to get it to work with arbitrarily long
unary proxies. Eg:
mixin binOpProxy("~-~");
void opBinary(string op : "+~-~", T)(T rhs){
writeln("+~-~");
}
More information about the Digitalmars-d
mailing list