Does q pass-by-value or pass-by-reference?

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.