Ali Cehreli wrote:
Thanks for all the responses.And yes, I know that 'ref' is what works for me here. I am trying to figure out whether I should develop a guideline like "always pass arrays with 'ref', or you may face surprises." I understand it very well now and was able to figure out a way to cause some bugs. :) What can be said about the output of the following program? Will main.a[0] be printed as 1 or 111? import std.cstream; void modify(int[] a) { a[0] = 1; // ... more operations ... a[0] = 111; } void main() { int[] a; a ~= 0; modify(a); dout.writefln(a[0]); } It depends on the operations in between the two assignments to a[0] in 'modify': - if we leave the comment in place, main.a[0] is 111 - if we replace the comment with this code foreach (i; 0 .. 10) { a ~= 2; } then main.a[0] is 1. In a sense, modify.a caused only "some" side effects in main.a. If we shorten the foreach, then main.a[0] is again 111. To me, this is at an unmanagable level. Unless we always pass with 'ref'. I don't think that this is easy to explain to a learner; and I think that is a good indicator that there is a problem with these semantics.
The ball is in your court to define better semantics. Andrei
