A = [0, 1, 2, 3]
B = A
A[1] = 2
// now B[1] == 2
Their manual section on arrays says this:In Julia, all arguments to functions are passed by reference. Some technical computing languages pass arrays by value, and this is convenient in many cases. In Julia, modifications made to input arrays within a function will be visible in the parent function.
but as the above example shows, it's really the semantics of assignment we're talking about here, not just that of function calls.
I believe that value semantics is easier to understand and less bug-prone, particularly for nonexpert programmers. It can also be implemented well enough that the small efficiency cost is worth paying in most cases. For one take on how to do this, see my my FSet functional collections library for Common Lisp[0]. For another, see the Clojure collection types.