function
The LPC function (or method)
The LPC function is similar but not identical to that provided by C (it is most similar to that provided by ANSI C). The syntax is as follows:
c
return_type function_name(arg1_type arg1, arg2_type arg2, ...)
{
// Variables can now be declared anywhere in the function body,
// not just at the top (C99-style)
variable_declarations;
...;
statements;
...;
more_variable_declarations; // Declarations can be interspersed
...;
return var0;
}Note that var0 must be of return_type.
If a function doesn't need to return a value, then it should be declared with a return_type of "void". E.g.
c
void function_name(arg1_type arg1, ...)
{
statements;
...;
}Invoke a function as follows:
function_name(arg1, arg2, arg3, ...);
You may invoke a function in another object as follows:
object->function_name(arg1, arg2, arg3, ...);
or:
call_other(object, function_name, arg1, arg2, ...);
First-Class Functions
Functions can be treated as first-class values and stored in variables. You can use function variables to implement callbacks, strategy patterns, and functional programming techniques.
Storing functions:
c
function f = add; // Store function reference
int result = f(5, 3); // Call it laterPassing functions as arguments:
c
void apply_operation(int a, int b, function op) {
int result = op(a, b);
printf("Result: %d\n", result);
}
int add(int x, int y) { return x + y; }
int multiply(int x, int y) { return x * y; }
void create() {
apply_operation(5, 3, add); // Result: 8
apply_operation(5, 3, multiply); // Result: 15
}Returning functions:
c
function get_comparator(string type) {
if (type == "ascending") return (: $1 - $2 :);
if (type == "descending") return (: $2 - $1 :);
return 0;
}
void sort_by_type(int *arr, string type) {
function cmp = get_comparator(type);
return sort_array(arr, cmp);
}Storing in data structures:
c
// Array of functions
function *operations = ({ add, subtract, multiply, divide });
int result = operations[0](10, 5);
// Mapping of functions
mapping commands = ([
"attack": (: do_attack :),
"defend": (: do_defend :),
"heal": (: do_heal :),
]);
void execute_command(string cmd) {
function handler = commands[cmd];
if (handler) handler();
}See also: types/function for more details on function pointers and syntax.