A function's arguments are passed by value by default. This means
that each parameter receives a copy of its argument's value(s), so
modifications to the parameter do not affect the caller's argument -
even if the variables are the same name - and changes are lost at
function exit. For example, here the function twiddle
modifies
its parameter $x
:
<A NAME=twiddle x>
<$x = ($x + 1)>
</A>
<A NAME=main>
<$x = 3>
x starts at: $x
<twiddle x=$x>
x is now: $x
</A>
When twiddle
is called in main
, it is passed a
copy of the global variable $x
. Upon return, the global
$x
in main
will still be 3: twiddle
modified a
local $x
that was discarded.
This behavior assures a caller that its local arguments will not be modified by the function without the caller's knowledge. (It also allows a function to modify its parameters as "scratch space".) Also, unlike some languages, there is little overhead in passing very large-valued arguments by value, because Vortex uses copy-on-write buffers for variables. Internally, variable data is copied only as needed, not just every time a function is called.