Semantically, q is pass-by-value. However, q only copies values of structures (i.e., lists, dictionaries, or tables) if they are modified by the callee, so q often performs as well as pass-by-reference.
What do you do if you want to have the callee modify variables passed by the caller? As our reader cyprus points out, you can pass the name of a global variable:
modifier: {[variable_name] variable_name set 47; } caller: {[] global:: "global"; modifier `global; show global; // prints 47 }
Whether this should be called pass-by-reference is the subject of many flame wars; Wikipedia’s entry on Evaluation strategy provides a cogent, balanced explanation of the varying interpretations of that (and related) terms. What’s important to know are the following:
- it is impossible for a callee to modify a caller’s local variables, and
- passing a large structure between functions is inexpensive until a callee modifies it.
but it is posible to pass a table by reference – using `t (t is a table)