Функции
Объявление
Функция начинается с типа результата: void, dyn, конкретный тип или класс.
jumper
void greet(String name) {
println("Hello, " + name);
}
int add(int a, int b) {
return a + b;
}
dyn pair(a, b) { // параметр без типа - это dyn
return [a, b];
}
greet("Ann");
println(add(2, 3)); // 5
println(pair(1, 2)); // [1, 2]- Типизированный результат проверяется:
int f()не может вернуть строку. - Количество аргументов не проверяется: недостающий равен
null, лишние игнорируются.pair(1)даёт[1, null]. - Значений по умолчанию, varargs и перегрузки нет.
- Функции можно вызывать выше их объявления и объявлять внутри других функций.
Лямбды
jumper
dyn square = x -> x * x;
dyn add = (a, b) -> a + b;
dyn log = (String msg) -> {
println("[log] " + msg);
};
println(square(7), add(2, 3)); // 49 5
log("started");Функции - это значения: их можно хранить в переменных, таблицах и массивах, передавать и возвращать.
jumper
dyn twice(f) { return x -> f(f(x)); }
println(twice(x -> x * 10)(1)); // 100Лямбду можно передать туда, где Java ждёт функциональный интерфейс (Runnable, Comparator, Consumer...), см. Работа с Java.
Замыкания
Функция видит переменные вокруг себя, причём сами переменные, а не их копии:
jumper
dyn counter() {
int n = 0;
return () -> { n++; return n; };
}
dyn next = counter();
next();
println(next()); // 2Переменные, объявленные внутри цикла, общие для всех замыканий, созданных в этом вызове. Чтобы сохранить каждое значение, создавайте замыкание в отдельной функции:
jumper
dyn keep(k) { return () -> k; }
dyn fs = [];
for (int i = 0; i < 3; i++) fs.add(keep(i));
println(fs[0](), fs[2]()); // 0 2Функции, которые вызывает хост
Хост может вызывать функции, объявленные на верхнем уровне скрипта: для событий, команд, тиков. Какие имена он вызывает, решает хост (см. Хосты):
jumper
void onJoin(dyn player) {
player.send("Welcome!");
}