This is awesome!<div>I would think, that making ranges like x..y a first-class object would solve all problems. In that case opSlice would return the slice, rather, then use it internally.<br><br><div class="gmail_quote">On Fri, Jun 1, 2012 at 5:57 AM, kenji hara <span dir="ltr"><<a href="mailto:k.hara.pg@gmail.com" target="_blank">k.hara.pg@gmail.com</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">I'd like to propose a new language feature to D community.<br>
<br>
I've opened a enhancement issue half a year ago.<br>
<br>
Issue 6798 - Integrate overloadings for multidimentional indexing and slicing<br>
<a href="http://d.puremagic.com/issues/show_bug.cgi?id=6798" target="_blank">http://d.puremagic.com/issues/show_bug.cgi?id=6798</a><br>
<br>
And, a pull request for implementing it is now available.<br>
<br>
<a href="https://github.com/D-Programming-Language/dmd/pull/443" target="_blank">https://github.com/D-Programming-Language/dmd/pull/443</a><br>
<br>
----<br>
This patch is an additional enhancement of opDollar (issue 3474 and #442).<br>
It would enable the mixing operator overloadings of indexing and slicing.<br>
<br>
The expression:<br>
a[$-1, 2..$]<br>
Translated to:<br>
a.opIndex(a.opDollar!0 - 1, a.opSlice!1(2, a.opDollar!1))<br>
<br>
If it is possible, the interval lwr..upr inside bracket is converted<br>
to a.opSlice!(dimension)(lwr, upr).<br>
This enhancement doesn't break existing codes.<br>
<br>
(Same table more readable is in<br>
<a href="https://github.com/D-Programming-Language/dmd/pull/443" target="_blank">https://github.com/D-Programming-Language/dmd/pull/443</a> )<br>
<br>
| expression | newly added overloading --><br>
exists/fallbcked overloading<br>
---+--------------------+------------------------------------------------------------<br>
| a[i0, ...] | xxx --> a.opIndex(i0, ...)<br>
| a[] | a.opIndex() --> a.opSlice()<br>
| a[l..u] | a.opIndex(a.opSlice!0(l, u)) --> a.opSlice(l, u)<br>
v | a[l..u, ...] | a.opIndex(a.opSlice!0(l, u), ...) --> xxx<br>
---+--------------------+------------------------------------------------------------<br>
| op a[i0, ...] | xxx --> a.opIndexUnary!op(i0, ...)<br>
| op a[] | a.opIndexUnary!op() --> a.opSliceUnary!op()<br>
| op a[l..u] | a.opIndexUnary!op(a.opSlice!0(l, u)) --><br>
a.opSliceUnary!op(l, u)<br>
v | op a[l..u, ...] | a.opIndexUnary!op(a.opSlice!0(l, u), ...) --> xxx<br>
---+--------------------+------------------------------------------------------------<br>
| a[i0, ...] = v | xxx --> a.opIndexAssign(v, i0, ...)<br>
| a[] = v | a.opIndexAssign(v) --> a.opSliceAssign(v)<br>
| a[l..u] = v | a.opIndexAssign(v, a.opSlice!0(l, u)) --><br>
a.opSliceAssign(v, l, u)<br>
v | a[l..u, ...] = v | a.opIndexAssign(v, a.opSlice!0(l, u), ...) --> xxx<br>
---+--------------------+------------------------------------------------------------<br>
| a[i0, ...] op= v | xxx --> a.opIndexOpAssign!op(v, i0, ...)<br>
| a[] op= v | a.opIndexOpAssign!op(v) --> a.opSliceOpAssign!op(v)<br>
| a[l..u] op= v | a.opIndexOpAssign!op(v, a.opSlice!0(l, u))<br>
--> a.opSliceOpAssign!op(v, l, u)<br>
v | a[l..u, ...] op= v | a.opIndexOpAssign!op(v, a.opSlice!0(l, u),<br>
...) --> xxx<br>
<br>
Thanks.<br>
<span class="HOEnZb"><font color="#888888"><br>
Kenji Hara<br>
</font></span></blockquote></div><br><br clear="all"><div><br></div>-- <br>Bye,<br>Gor Gyolchanyan.<br>
</div>