On 06/19/2014 07:08 AM, Sebastian Gesemann wrote:
No, it's more like
a + x * (b + x * (c + x * d)))
It can't be that and be efficient as it is right now (returning a clone
for each binop). I am not willing to trade efficiency for sugar,
especially not when trade is this bad (in fact that's the entire point
of this thread). In my matrix library through the use of lazy evaluation
I can make my code run as fast as a manual loop implementation would.
This would not be the case here.
I will note that you could very well implement a by-value self operator
overload trait
The difference is that the short operator-based expression *works*
right now whereas forcing a "moving self type" on to people makes this
expression not compile for types that are not Copy. So, given the two
options, I actually prefer the way things are right now.
It's inefficient, so it doesn't 'work'.
I think, to convince people (either way) a deeper analysis is needed.
I don't think merely changing the type of self/arg to be by move is the
only solution, or the best solution. It does seem to be the case that
different operators benefit from reusing temporaries differently, but
it's clear that *some* operators definitely do (e.g. thing/scalar
operators, addition/subtraction, element-wise matrix-operators) and the
current operator overloading traits prevent that optimization without
the use of RefCell or lazy evaluation. Both of those have non-trivial
semantic costs. In the case of operators that do benefit from reusing
temporaries, doing so via moving seems very natural and relatively clean.
Regardless, bignum and linear-algebra are prime candidates for operator
overloading, but the way it is done now by most implementations is just
unsatisfactory. Maybe bignums in std::num and all the linear algebra
libraries could be converted to use a lazy evaluation, thus avoiding
this issue of changing the operator overload traits. Alternatively,
maybe the whole operator-overloading idea-via traits is broken anyway
since operators do have such different semantics for different types (in
particular, efficient semantics of operators differ from built-in
numeric types and complicated library numeric types). Maybe adding
attributes to methods (e.g. #[operator_add] fn my_add(self, whatever) {}
) is more flexible since it is becoming clear that generic numeric code
(generic to bignums and normal integers and matrices) might not be a
possibility.
I should note that it is already an impossibility in many cases (I
guarantee that my lazy matrix library won't fulfill the type bounds of
any function due to how its return types differ from the argument types).
-SL
_______________________________________________
Rust-dev mailing list
[email protected]
https://mail.mozilla.org/listinfo/rust-dev