Хостинг серверов Minecraft playvds.com
  1. Вы находитесь в русском сообществе Bukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на русский язык плагины наших собратьев из других стран.
    Скрыть объявление

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

Тема в разделе "Руководства, инструкции, утилиты", создана пользователем DPOH-VAR, 17 авг 2013.

  1. Автор темы
    DPOH-VAR

    DPOH-VAR Старожил Пользователь

    Баллы:
    153
    Skype:
    dpohvar
    -----------------------------------------------------
    Разработка VarScript 0.5 (ссылки на другие уроки, полезные функции, модули и т.д.)
    VarScript на dev.bukkit.org (скачать можно тут)
    -----------------------------------------------------
    Создание функции

    Функции в 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
    Функции при вызове используют тот же самый стек.
    Таким образом, чтобы передать значение в функцию, нужно перед вызовом функции оставить это значение в стеке.

    <продолжение ниже>
     
    Joomplix нравится это.
  2. Хостинг MineCraft
    <
  3. Автор темы
    DPOH-VAR

    DPOH-VAR Старожил Пользователь

    Баллы:
    153
    Skype:
    dpohvar
    Замыкания и область видимости

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

    "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 не определена в этом контексте
     
  4. Joomplix

    Joomplix Старожил Пользователь

    Баллы:
    103
    Skype:
    Zolik767
    Имя в Minecraft:
    BetterSwetten
    Интересно))
     

Поделиться этой страницей