Previous page Table of Contents Next page
The name _ (pronounced "blank") has a special meaning, indicating partial application, also known as curried functions. It acquires this meaning because its definition in the PLOT module is a macro that takes no arguments and expands into a special flag. The infix ( macro, which is the syntax for function calls, recognizes this flag and produces a function constructor instead of an invocation. The expression parser does the same thing for operator calls. The logic to recognize the curried function flag is centralized in a pseudo-constructor curryable-invocation which returns either an invocation, a spread-invocation, or a functation.
Thus a function call expression (whether written with parentheses or with an operator) where one or more of the arguments is the name _ does not call the function. Instead, it constructs a function containing one method with as many arguments as there are underscores, which when called will call the original function with its arguments substituted for the underscores, and non-underscore arguments having the values originally specified.
For example, _ + 5 is a function of one argument that adds 5 to its argument.
It is not easy to generalize this to e.g. _ + 3 * _ as a function of two arguments that adds the first to three times the second. We will not try. Instead, _ + 3 * _ is a function of one argument that adds its argument to another function of one argument that multiplies its argument by 3, as if it had been written _ + (3 * _). Presumably the + function has no method applicable to functions.
The keyword "...:", which cannot be written in source code but can be created by calling the constructor keyword("..."), serves as a flag to curryable-invocation to indicate that the preceding argument is to be spread.
Previous page Table of Contents Next page