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>