November 19, 2021

I just want to share a view lines of code.
The availability of operator overloading can result in very short and precise code for linear algebra.
To test/explore it a little I just modified the alias this example:

#!/usr/bin/env rdmd
struct Point
{
    double[2] p;
    // Forward all undefined symbols to p
    alias p this;
    auto opBinary(string op)(Point rhs)
    {
        static if (op == "+")
        {
            Point ret;
            ret[0] = p[0] + rhs.p[0];
            ret[1] = p[1] + rhs.p[1];
            return ret;
        }
        else static if (op == "-")
        {
            Point ret;
            ret[0] = p[0] - rhs.p[0];
            ret[1] = p[1] - rhs.p[1];
            return ret;
        }
        else static if (op == "*")
            return p[0] * rhs.p[0] + p[1] * rhs.p[1];
        else
            static assert(0, "Operator " ~ op ~ " not implemented");
    }
}

void main()
{
    import std.stdio;// : writefln,write;

    // Point behaves like a `double[2]` ...
    Point p1, p2;
    p1 = [2, 1], p2 = [1, 1];
    // ... but with extended functionality
    writef("p1*(p1 + p2) = %s*(%s + %s) =", p1, p1, p2);
    write(p1 * (p1 + p2)); // compare this to code without operator overload:
}

Compare: p1 * (p1 + p2) to something with a structure like dot(p1,(add(p1,p2)).
(With the Dlangs UFCS it might become: p1.dot(p1.add(p2)) )