On Thursday, 12 July 2012 at 12:43:24 UTC, Tommi wrote:
On Thursday, 12 July 2012 at 10:05:16 UTC, Thiez wrote:
Have you considered adding operator overloading using UFCS
while you're at it?
I assumed it's already possible to add operators
non-intrusively, because operators are just syntactic sugar for
method calls:
++var; // actual code
var.opUnary!"++"(); // lowered once
opUnary!"++"(var); // lowered twice (if necessary)
If you're talking about overloading existing operators (which
have been implemented as member functions) non-intrusively for
other types, then I don't know, doesn't it work?
I actually tried those yesterday (with opEquals and opCmp on
structs) and couldn't get it to work. Code still used what
appeared to be an automatically generated opEquals (that appears
to perform a bitwise comparison) instead of my UFCS opEquals.
It's already quite obvious that the compiler does not obey its
own rewrite rules (see
http://dlang.org/operatoroverloading.html#compare) Consider opCmp:
a < b
is rewritten to
a.opCmp(b) < 0
or
b.opCmp(a) > 0
Let's assume the first rule is always chosen. According to the
very rewrite rule we just applied, this must be rewritten to
a.opCmp(b).opCmp(0) < 0
which must be rewritten to
a.opCmp(b).opCmp(0).opCmp(0) < 0
and then
a.opCmp(b).opCmp(0).opCmp(0).opCmp(0) < 0
and so on, to infinity.
It seems quite obvious the compiler does not rewrite compares on
integers or all hell would break loose... The language reference
should be more specific about these things.