On Tuesday, 13 March 2018 at 15:47:36 UTC, Martin Tschierschke wrote:

I think for mathematics it is more important for easy handling,
to be able to get the element of a matrix a_ij by a(i,j) and not only by a[i-1,j-1].
[snip]


I didn't really address this in my other post.

What you're talking about is 0-based or 1-based indexing. Most languages force you to choose, though there are a few languages that let you specify the type of index you want (Pascal, Chapel, and Ada come to mind).

While I've thought that the way Chapel does domains is cool, I guess I never gave much thought into implementing the optional 0 or 1 based indexing in D. Now that I'm thinking about it, I don't see why it couldn't be implemented. For instance, there's nothing stopping you from writing a function like below that has the same behavior.

auto access(T)(T x, size_t i, size_t j)
{
     return(x.opIndex(i - 1, j - 1));
}

What you really care about is the nice syntax. In that case, you could write an opIndex function that has different behavior based on a template parameter in Slice. Even something simple like below might work.

auto ref opIndex(Indexes...)(Indexes indexes) @safe
    if (isIndexSlice!Indexes)
{
    static if (defaultIndexingBehavior)
    {
        return this.opIndex!(indexes.length)([indexes]);
    }
    else
    {
        Indexes newIndexes;
        foreach(i, e; indexes)
        {
            newIndexes[i] = e - 1;
        }
        return this.opIndex!(indexes.length)([newIndexes]);
    }
}

The time-consuming part is that you'd have to go through all of mir where it relies on opIndex and ensure that both sets of behavior work.



Reply via email to