Туториал [VarScript 0.5] Функции, замыкания

DPOH-VAR

Старожил
Пользователь
Баллы
153
-----------------------------------------------------
Разработка VarScript 0.5 (ссылки на другие уроки, полезные функции, модули и т.д.)
VarScript на dev.bukkit.org (скачать можно тут)
-----------------------------------------------------
Это четвертый тутор по плагину VarScript 0.5
В нем рассматриваются технологии создания функций и замыканий.
Предполагается, что читатель уже достаточно хорошо знаком с плагином.

Создание функции

Функции в varscript являются независимыми объектами и объявить их можно практически на любом участке кода
Правило: Все, что находится внутри фигурных скобок - является отдельной функцией.

Название{ (тело функции) }
Такая конструкция создает новую функцию и оставляет ее на вершине стека.
Функция может не содержать имени (она будет безымянной)
Пример:
/> {ME 0:2:0 THROW 20 TICKS BOLT KILL} %sceneKill
/> @sceneKill RUN ## запуск функции

%Название{ (тело функции) }
Эта конструкция определит функцию в локальной области видимости. Проще говоря, конструкция
%Foo{ bar }
аналогична записи
Foo{ bar } %%Foo
И опять же пример:
%SceneKill{ ## Player -> Player
0:2:0 THROW ## подбросить вверх​
20 TICKS ## подождать 1 секунду​
BOLT ## ударить молнией​
KILL ## убить​
}
ME SceneKill
Функции можно вызывать, просто указав их имя. Т.е. конструкция
ME SceneKill
полностью аналогична
ME @SceneKill RUN

$Название{ (тело функции) }
Данная конструкция присвоит функцию как поле текущему объекту THIS. Примеры и применение будут рассмотрены позже.

Вызов функции

Для вызова функции используется команда RUN
Если функция записана в переменной, достаточно написать имя этой переменной.
Функция должна быть определена до ее вызова!
SayHello ## выдаст ошибку, значение переменной SayHello - не функция
%SayHello{ ## Функция
"Hello World" PRINT ## напечатать Hello World​
}
SayHello ## запустит функцию SayHello
@SayHello RUN ## точно также запустит функцию SayHello
Получается, что функция видна в теле программы после объявления (как и переменные).

Передача параметров в функцию

Функцию стоит воспринимать как линейный набор команд, исполняющийся при вызове.
То есть
ME 10 SHIFT
Исполнится точно также, что и
ME { 10 SHIFT }RUN
Функции при вызове используют тот же самый стек.
Таким образом, чтобы передать значение в функцию, нужно перед вызовом функции оставить это значение в стеке.

<продолжение ниже>
 
Замыкания и область видимости

Область видимости переменных по умолчанию распространяется на весь глобальный контекст:

"hello" %x
@x PRINT ## вывезет hello
%Foo{
@x PRINT ## вывезет hello​
}
@Foo RUN

Если же переменная является локальной, то она доступна только в том контексте, где определена. Область видимости ограничивается фигурными скобками (внутри функции)

%Foo{
"hello" %x​
"world" %%y​
@x PRINT ## вывезет hello​
@y PRINT ## вывезет world​
}
@Foo RUN
@x PRINT ## вывезет hello
@y PRINT ## вывезет null - переменная в этом контексте не определена

Технология замыканий полностью реализована в varscript 0.5
[wiki|Замыкание]
Переменные, объявленные вне функции, могут быть использованы внутри нее.
Пример:

%Foo{ ## объявление функции Foo в глобальном контексте
3 %%x ## объявление локальной переменной x​
%Bar{ ## объявление функции Bar в контексте функции Foo​
10 %x ## изменение переменной x​
}​
@x PRINT ## выведет 3​
@Bar RUN ## запуск функции Bar​
@x PRINT ## выведет 10​
}
@Foo RUN ## запуск функции Foo
@Bar RUN ## ошибка! Функция Bar не определена в этом контексте
 
Назад
Верх