Skip to content

Функции ​

Объявление ​

Функция начинается с типа результата: 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!");
}

Распространяется под лицензией MIT.