shortcut for dynamic dispatch and operators

Andrei Alexandrescu SeeWebsiteForEmail at erdani.org
Tue Dec 1 11:01:26 PST 2009


KennyTM~ wrote:
> On Dec 1, 09 22:30, Steven Schveighoffer wrote:
>> An idea I just had when thinking about how ugly opDispatch and opBinary
>> operators will be if we get those was, wouldn't it be cool if the
>> compiler could translate:
>>
>> myTemplateMethod("abc" || "def")() if(condition) {}
>>
>> to
>>
>> myTemplateMethod(string __x)() if((__x == "abc" || __x == "def") &&
>> condition) {}
>>
>> It makes dispatch based on compile-time strings much more palatable, for
>> example:
>>
>> opDispatch("foo" || "bar")() {...}
>> opBinary("+" || "-" || "*")(int rhs) {...}
>>
>> instead of:
>>
>> opDispatch(string fn)() if(fn == "foo" || fn == "bar") {...}
>> opBinary(string op)() if(op == "+" || op == "-" || op == "*")(int rhs)
>> {...}
>>
>> In fact, it can be generalized to any type which has literals:
>>
>> factorial(int x)(){ return factorial!(x-1)() * x;}
>> factorial(1)() { return 1;}
>>
>> What I don't know is if the || works in all cases -- because something
>> like true || false is a valid expression. Maybe someone can come up with
>> a better way.
>>
>> -Steve
> 
> Alternative suggestion:
> 
> Make "x in y" returns a bool and works for arrays. Then you can write
> 
> int opBinary(string s)(int rhs) if (s in ["+", "-", "*", "/", "^", "|", 
> "&"]) { ... }
> 

It's a bit difficult to see a very thin operator mask a linear 
operation, but I'm thinking maybe "x in y" could be defined if y is a 
compile-time array. In that case, the compiler knows the operation and 
the operand so it may decide to change representation as it finds fit.

Andrei



More information about the Digitalmars-d mailing list