Hi all,

I think D has a lot to offer technical computing:
  - the speed and modeling power of C++
  - GC for clean API design
  - reflection for automatic bindings
And technical computing has a lot to offer D:
  - users
  - API writers
  - time in the minds of people who teach

Multidimensional array support is important for this exchange to happen, so as a D user and a computer vision researcher I'm glad to see it's being addressed! However, I'm interested in hearing more about the rationale for the design decisions made concerning pull request #443. My concern is that this design may be ignoring some of the lessons the SciPy community has learned over the past 10+ years. A bit of elaboration:

In Python, slicing and indexing were originally separate operations. Custom containers would have to define both `__getitem__(self, key)` and `__getslice__(self, start, end)`. This is where D is now. Python then deprecated `__getslice__` and decided `container[start:end]` should translate to `container[slice(start, end)]`: the slicing syntax just became sugar for creating a lightweight slice object (i.e. a "range literal"), but it only worked inside an index expression. If I understand correctly, this is similar in spirit to the solution the D community seems to be converging upon. This solution enables multidimensional slicing, but needlessly prohibits the construction of range literals outside of an index expression.

So, why is this important? One point of view is that multidimensional slicing is just one of many use cases for a concise representation of a range of numbers. In more "specialized" scientific languages, like MATLAB/Octave and Julia, range literals are a critical component to readable, idiomatic code. In order to partially make up for this, SciPy is forced to subvert Python's indexing syntax for calling functions that may operate on numeric ranges, obfuscating code (e.g. http://docs.scipy.org/doc/numpy/reference/generated/numpy.r_.html).

I point this out because it (fortunately) seems like D is in a position to have range literals while maintaining backwards compatibility and reducing language complexity (details are below). I'd like to hear your thoughts about range literals as a solution for multidimensional indexing: whether it's been proposed, if so, why is was decided against, what its disadvantages might be, whether they're compatible with the work already done on this front, etc.

===================
Range Literals in D
===================

// Right now this works:
foreach (i; 0..10) doScience(i);

// And this works:
auto range = iota(0, 10);
foreach (i; range) doScience(i);

// So why shouldn't this work?
auto range = 0..10;
foreach (i; range) doScience(i);

// Or this?
auto range = 0..10;
myFavoriteArray[range] = fascinatingFindings();

// Or this?
auto range = 0..10;
myFavoriteMatrix[0..$, range] = fascinating2DFindings();

// `opSlice` would no longer be necessary...
myMap["key"];       // calls `opIndex(string);`
myVector[5];        // calls `opIndex(int);`
myMatrix[5, 0..10]; // calls `opIndex(int, NumericRange);`

// But old code that defines `opSlice` could still work (like in Python).
myVector[0..10]; // If `opIndex(NumericRange)` isn't defined,
                 // fall back to`opSlice`.

// `ForeachRangeStatement` would no longer need to exist as an odd special case. // The following two statements are semantically equivalent, and with range
// literals, they'd be instances of the same looping syntax.
foreach (i; 0..10) doScience();
foreach (i; iota(0, 10)) doScience();

// Compilers would, of course, be free to special-case `foreach` loops
// over range literals, if it's helpful for performance.

On Wednesday, 12 March 2014 at 13:55:05 UTC, Kenji Hara wrote:
2014-03-08 10:24 GMT+09:00 Andrei Alexandrescu <
seewebsiteforem...@erdani.org>:


I agree and sympathize.


I finished to update my pull request #443. Now it is active.

Kenji Hara

Reply via email to