Implementation notes

Note that the implementation of a function can tell the difference between whether it is called with parentheses and no arguments, like “func()”, or called without parentheses at all, like “func” – in the former case it receives an argument count of 0, and in the latter an argument count of -1. So the same symbol can have different semantics depending on which way it is called. In most cases such a difference is counterintuitive, but it seems to work fairly well for the directional “constants,” i.e. bare “left” is the displacement &(-1,0,0), whereas left() is the location one to the left. The no-parentheses form is also useful for constants like “e” and “tau”, and it is also used, for example, to allow the names of the functions “floor”, “round”, etc. to be used as keywords for the int() function.

Note also that some functions are actually implemented as macros, which are just like functions but receive their arguments unevaluated. The difference is meant to be transparent to usage of the function, so it is not mentioned elsewhere in this documentation. However, the macro facility is necessary when the function would need to control the evaluation of the arguments, as in the short-circuiting logical operations, or takes an expression as an argument, say to evaluate it on other cells.