I would like to revisit the topic of operator overloads for multidimensional slicing.

Bottom line: opSlice is currently limited to 1 dimension/axis only. The cleanest workaround right now is to pass your own "slice" structs to opIndex. It works but it's not too pretty.

----
// Suppose we have a user-defined type...
auto mat = Matrix(
    [ [0,1,2],
      [3,4,5],
      [6,7,8] ] );

// This type of indexing can be implemented:
auto cell = mat[1, $-1];

// But multidimensional slicing cannot:
// auto submatrix = mat[0..2, 1..$];

// "Cleanest" workaround with a slice struct S taken by opIndex
//  (no $ capability):
auto submatrix = mat[ S(0,2), S(1,3) ];

// With a bit more hacking, something like this could be done:
auto submatrix = mat[ S[0..2], S[1..$] ];
----

Problem with current state of affairs and rationale for a fix:

* A stated design goal of D is to "Cater to the needs of numerical analysis programmers", and presumably HPC / scientific computing that's heavy on linear algebra and n-dimensional arrays. Well, it seems like the multidimensional slice/stride syntax in Matlab, NumPy, and even Fortran has been pretty popular with these folks. Syntactic sugar here is a clear win. I don't think it's a niche feature. * The limitation on slicing is inconsistent with the capabilities of opIndex and opDollar, and workarounds are ugly. * The approved DIP#7 briefly mentions multidimensional slicing but it was never implemented (despite opDollar getting done).

Recap of discussions so far:

* 2009-10-10: DIP7 (http://www.prowiki.org/wiki4d/wiki.cgi?LanguageDevel/DIPs/DIP7) * 2010-03-08: "Proposal: Multidimensional opSlice solution" (http://forum.dlang.org/thread/hn2q9q$263e$1...@digitalmars.com) * 2011-10-09: "Issue #6798: Integrate overloadings for multidimensional indexing and slicing" * 2012-06-01: "[Proposal] Additional operator overloadings for multidimentional indexing and slicing" (http://forum.dlang.org/thread/mailman.1202.1338515967.24740.digitalmar...@puremagic.com) * 2012-11-19: "Multidimensional array operator overloading" (http://forum.dlang.org/thread/mailman.2065.1353348152.5162.digitalmar...@puremagic.com) * 2012-12-19: "Multidimensional slice" (http://forum.dlang.org/thread/lglljlnzoathjxijo...@forum.dlang.org) * 2013-04-06: "rationale for opSlice, opSliceAssign, vs a..b being syntax suger for a Slice struct?" (http://forum.dlang.org/thread/mailman.551.1365290408.4724.digitalmars-d-le...@puremagic.com) * 2013-05-12: Andrei asks for feedback on Kenji's 2011 pull request for #6798 * 2013-10-11: "std.linalg" (http://forum.dlang.org/thread/rmyaglfeimzuggolu...@forum.dlang.org)

Steps forward:

So I basically want resurrect the topic and gauge support for fixing slice overloads. Then, core committers could revisit Kenji's 2011 proposal and pull request for issue #6798 as a very solid near-term solution. Finally, perhaps a DIP for stride syntax/overloads?

Looking forward to discussion.

Reply via email to