digitalmars.D - array operation a[] + b[] not implemented??
- Trass3r (16/16) Jan 17 2010 It is implemented in the runtime so why doesn't it work?
- Matti Niemenmaa (14/30) Jan 17 2010 This is Bug 3066: http://d.puremagic.com/issues/show_bug.cgi?id=3066
- dsimcha (12/47) Jan 17 2010 As a side note, why isn't this allowed? It seems like a perfectly reaso...
- Trass3r (11/18) Jan 17 2010 Can't think of any point against it as well.
- Don (3/30) Jan 18 2010 Array operations are still one of the most incomplete parts of the
- Lars T. Kyllingstad (5/20) Jan 18 2010 Quoting Andrei in his "Short list with things to finish for D2" post
- Trass3r (2/12) Jan 18 2010 The question is, how much this is generalized with ranges. It needs to
- Lars T. Kyllingstad (9/25) Jan 18 2010 Yeah, and most likely it will. But you can't expect every range to
It is implemented in the runtime so why doesn't it work? /*********************** * Computes: * a[] = b[] + c[] */ T[] _arraySliceSliceAddSliceAssign_f(T[] a, T[] c, T[] b) ... ... void main() { float[] a = [0.f, 0.5f, 1.0f, 1.5f, 2.0f, 2.5f]; float[] b = [0.f, 0.5f, 1.0f, 1.5f, 2.0f, 2.5f]; // float[] c = a[] + b[]; // <-- Array operation a[] + b[] not implemented float[] d = a[] * 4.f + 1.f; writeln(d); // <-- access violation when program is run }
Jan 17 2010
On 2010-01-18 00:42, Trass3r wrote:It is implemented in the runtime so why doesn't it work? /*********************** * Computes: * a[] = b[] + c[] */ T[] _arraySliceSliceAddSliceAssign_f(T[] a, T[] c, T[] b) ... ... void main() { float[] a = [0.f, 0.5f, 1.0f, 1.5f, 2.0f, 2.5f]; float[] b = [0.f, 0.5f, 1.0f, 1.5f, 2.0f, 2.5f]; // float[] c = a[] + b[]; // <-- Array operation a[] + b[] not implemented float[] d = a[] * 4.f + 1.f; writeln(d); // <-- access violation when program is run }This is Bug 3066: http://d.puremagic.com/issues/show_bug.cgi?id=3066 Your code is invalid, since per the spec (http://www.digitalmars.com/d/1.0/arrays.html) array operations are valid only on the RHS of an assignment when there's a slice on the LHS. In your case, you're not performing an assignment at all, you're initializing, and array operations are not valid initializers. To fix, preallocate and then perform the array op: auto c = new float[a.length]; c[] = a[] + b[]; auto d = new float[a.length]; d[] = a[] * 4.f + 1.f; -- E-mail address: matti.niemenmaa+news, domain is iki (DOT) fi
Jan 17 2010
== Quote from Matti Niemenmaa (see_signature for.real.address)'s articleOn 2010-01-18 00:42, Trass3r wrote:As a side note, why isn't this allowed? It seems like a perfectly reasonable thing to have: float[] c = a[] + b; create a new array. The semantics of what this would do are unambiguous, it doesn't interact poorly (or at all) with the rest of the language in any way I can think of, the fact that it's not allowed is very surprising to newbies, and it's highly convenient. Why force people to write boilerplate code if there's no tradeoff and you're not gaining anything in return? Also, see bug 2549 (http://d.puremagic.com/issues/show_bug.cgi?id=2549). If for some reason we don't allow the creation of new arrays using array ops, we need to fix the error detection.It is implemented in the runtime so why doesn't it work? /*********************** * Computes: * a[] = b[] + c[] */ T[] _arraySliceSliceAddSliceAssign_f(T[] a, T[] c, T[] b) ... ... void main() { float[] a = [0.f, 0.5f, 1.0f, 1.5f, 2.0f, 2.5f]; float[] b = [0.f, 0.5f, 1.0f, 1.5f, 2.0f, 2.5f]; // float[] c = a[] + b[]; // <-- Array operation a[] + b[] not implemented float[] d = a[] * 4.f + 1.f; writeln(d); // <-- access violation when program is run }This is Bug 3066: http://d.puremagic.com/issues/show_bug.cgi?id=3066 Your code is invalid, since per the spec (http://www.digitalmars.com/d/1.0/arrays.html) array operations are valid only on the RHS of an assignment when there's a slice on the LHS. In your case, you're not performing an assignment at all, you're initializing, and array operations are not valid initializers. To fix, preallocate and then perform the array op: auto c = new float[a.length]; c[] = a[] + b[]; auto d = new float[a.length]; d[] = a[] * 4.f + 1.f;
Jan 17 2010
As a side note, why isn't this allowed? It seems like a perfectly reasonable thing to have: float[] c = a[] + b;Can't think of any point against it as well. Add writeln(a[] + b[]) as a case where one would expect a new array to be created.Also, see bug 2549 (http://d.puremagic.com/issues/show_bug.cgi?id=2549). If for some reason we don't allow the creation of new arrays using array ops, we need to fix the error detection.Yeah, it's strange that something like writeln(a[] * 4.f + 1.f); or writeln(a[] * b[]); gives the described access violation, while writeln(a[] + b[]); yields Array operation not implemented.
Jan 17 2010
Trass3r wrote:Array operations are still one of the most incomplete parts of the compiler. It's not hard to find bugs.As a side note, why isn't this allowed? It seems like a perfectly reasonable thing to have: float[] c = a[] + b;Can't think of any point against it as well. Add writeln(a[] + b[]) as a case where one would expect a new array to be created.Also, see bug 2549 (http://d.puremagic.com/issues/show_bug.cgi?id=2549). If for some reason we don't allow the creation of new arrays using array ops, we need to fix the error detection.Yeah, it's strange that something like writeln(a[] * 4.f + 1.f); or writeln(a[] * b[]); gives the described access violation, while writeln(a[] + b[]); yields Array operation not implemented.
Jan 18 2010
dsimcha wrote:As a side note, why isn't this allowed? It seems like a perfectly reasonable thing to have: float[] c = a[] + b; create a new array. The semantics of what this would do are unambiguous, it doesn't interact poorly (or at all) with the rest of the language in any way I can think of, the fact that it's not allowed is very surprising to newbies, and it's highly convenient. Why force people to write boilerplate code if there's no tradeoff and you're not gaining anything in return?Quoting Andrei in his "Short list with things to finish for D2" post (2009-11-19):* Loop fusion that generalizes array-wise operations. This idea of Walter is, I think, very good because it generalizes and democratizes "magic". The idea is that, if you do a = b + c; and b + c does not make sense but b and c are ranges for which a.front = b.front + c.front does make sense, to automatically add the iteration paraphernalia.If I read this correctly, what you're asking for will most likely happen. -Lars
Jan 18 2010
Quoting Andrei in his "Short list with things to finish for D2" post (2009-11-19):The question is, how much this is generalized with ranges. It needs to detect the special case of arrays and use vector operations then.* Loop fusion that generalizes array-wise operations. This idea of Walter is, I think, very good because it generalizes and democratizes "magic". The idea is that, if you do a = b + c; and b + c does not make sense but b and c are ranges for which a.front = b.front + c.front does make sense, to automatically add the iteration paraphernalia.If I read this correctly, what you're asking for will most likely happen.
Jan 18 2010
Trass3r wrote:Yeah, and most likely it will. But you can't expect every range to define the no-parameter opSlice() function, which means that the syntax for "range operations" should be just a = b + c; It would then be pretty silly if we still had to use the a[] = b[] + c[]; syntax for the special case of arrays, so I assume that will change as well. -LarsQuoting Andrei in his "Short list with things to finish for D2" post (2009-11-19):The question is, how much this is generalized with ranges. It needs to detect the special case of arrays and use vector operations then.* Loop fusion that generalizes array-wise operations. This idea of Walter is, I think, very good because it generalizes and democratizes "magic". The idea is that, if you do a = b + c; and b + c does not make sense but b and c are ranges for which a.front = b.front + c.front does make sense, to automatically add the iteration paraphernalia.If I read this correctly, what you're asking for will most likely happen.
Jan 18 2010