NTSL (NanoTrasen Scripting Language) - это скриптовый язык программирования, созданный техническим подразделением Nanotrasen в целях расширения возможностей некоторых устройств Nanotrasen. Язык имеет смешанный синтаксис, унаследованный от языков PHP, Си и JavaScript. Основные реализации языка не поддерживают объектно-ориентированное программирование, хотя он позволяет создавать inline-функции.
Обратите внимание на то, что NTSL не имеет никакого отношения к языку DM Script в BYOND.
Синтаксис[]
NTSL использует простой синтаксис, унаследованный от языка Си PHP. Пробелы игнорируются "компилятором", точки с запятой используются для разделения инструкций языка. Блоки кода оформляются фигурными скобками.
Переменные[]
Переменные используются для хранения данных во время выполнения программы и могут быть доступны из какого-то места в коде. Об области видимости переменных будет описано ниже. Переменная создается так:
// это комментарий, он будет проигнорирован интерпретатором. $myVariable = 5; // "$" - начало идентификатора переменной.
В NTSL используется динамическая типизация, это значит, что можно присвоить этой же переменной строковое (текстовое) значение:
$myVariable = "Здравствуй, мир!";
В отличии от, например, языка Си, в котором необходимо явно указывать тип:
int foo = 14; // целое число float pi = 3.14; // действительное число одинарной точности char* string = "Hello, World!"; // указатель на строку
Функции[]
Функции могут быть определены в любых местах кода. В каждой реализации NTSL встроенные функции могут различаться, но основные функции всегда те же. Вот пример использования функции:
$myVariable = getNumber();
Здесь $myVariable присваивается значение, которое возвращает функция getNumber(). Функции всегда возвращают значения, даже если выходные значения не определены явно ключевым словом return.
Функции могут принимать различные значения и переменные в качестве аргументов:
broadcast($myVariable); broadcast("Здравствуй, мир!"); // здесь показана конкатенация (слияние строк), которая осуществляется оператором + broadcast("Станция будет уничтожена через " + $myVariable + " секунд.");
Важно: нельзя передавать в качестве аргументов другие функции.
Например:
$foo = func( callback() ); // интерпретатор выдаст ошибку
Вы также можете создавать свои функции, используя ключевое слово def:
def getRandomNumber() { return 5; }
Область видимости переменных[]
Переменные, определенные внутри какого-то блока кода называются локальными и недоступны из других участков кода, которые не относятся к данному блоку:
$myGlobalVariable = getNumber(); // глобальная переменная, она доступна из любого места в коде. while($myGlobalVariable != 0) { $myLocalVariable = 0; $myGlobalVariable = $myLocalVariable; } $myLocalVariable = 50; // Это ошибочный код; myLocalVariable за пределами блока. А вот myGlobalVariable можно изменять в любом месте кода.
Злоупотребление глобальными переменными является плохим тоном в программировании!
Условия[]
В предыдущем примере был приведен цикл while, который называется условным, так как код внутри тела цикла исполняется, пока условие в скобках истинно. != известен как оператор сравнения, он возвращает true (истина), если myGlobalVariable не равно 0. Этот цикл можно прочитать так: "Пока myGlobalVariable не равно 0, выполнять следующий блок кода".
Операторы сравнения[]
== : равно (эквивалентно) != : не равно (не эквивалентно) < : меньше > : больше <= : меньше или равно >= : больше или равно
В NTSL есть ветвление ЕСЛИ, осуществляемое ключевым словом if:
if($myVariableNumber == 50) // если myVariableNumber равно 50 { // код } elseif($myVariableNumber <= 30) // иначе если myVariableNumber меньше или равно 30 { // код } else // иначе. Выполняется, если все условия выше ложны { // код }
Математика[]
$foo = 2 + 2;
В переменную foo запишется результат операции сложения.
Математические операторы[]
* : умножение
+ : сложение (если операнды будут являться строками, то произойдет их конкатенация)
- : вычитание
/ : деление
^ : возведение в степень, например 7^2, где 2 - показатель степени.
Встроенные функции[]
Здесь приведен список стандартных функций в NTSL. В NTSL постоянно добавляются новые функции, поэтому этот список может быть неполным.
Функции для работы с числами[]
Синтаксис Возвращаемое значение Описание prob(number) number Вычисляет вероятность. sqrt(number) number Возвращает квадратный корень аргумента. abs(number) number Возвращает модуль аргумента. floor(number) number Округляет действительное число в меньшую сторону. ceil(number) number Округляет действительное число в большую сторону. round(number) number Округляет число до ближайшего целого. clamp(number, number, number) number Проверяет, находится ли аргумент 1 в заданном аргументами 2 и 3 диапазоне, если аргумент 1 находится, то функция возвращает его, если нет, то возвращает ближающую границу диапазона. clamp(30, -30, 25) = 25 inrange(number, number, number) number Похожа на предыдущую функцию, но, в отличии от нее, возвращает 1, если аргумент 1 находится в диапазоне. min(...) number Возвращает наименьшее значение аргументов. max(...) number Возвращает наибольшее значение аргументов. tostring(number) string Преобразовывает числовой аргумент в строку. rand(number, number) number Возвращает псевдослучайное число из указанного диапазона между Арг.1 и Арг.2. rand(number) number Возвращает псевдослучайное число между 0 и аргументом. rand() number Возвращает число с плавающей точкой между 0 и 1. randseed(number) Инициализирует генератор псевдослучайных чисел указанным значением. sin(value) number Возвращает синус аргумента. cos(value) number Возвращает косинус аргумента. asin(value) number Возвращает арксинус аргумента. acos(value) number Возвращает арккосинус аргумента. log(value) number Возвращает логарифм аргумента.
Функции для работы со строками[]
Строка это последовательность символов, включая пробелы. Длиной строки называется количество символов в ней.
Синтаксис Возвращаемое значение Описание find(string, string) number Сравнивает строки и возвращает позицию первого встреченного сходства в первом аргументе или 0, если функция не нащла сходства в строках. length(string) number Возвращает длину строки. substr(string, number, number) string Извлекает строку из первого аргумента между указанными в аргументами 2 и 3 позициями строки. replace(string, string, string) string Заменяет строку в первом аргументе по шаблону во втором аргументе значением из третьего аргумента. lower(string) string Переводит символы в строке в нижний регистр. upper(string) string Переводит символы в строке в верхний регистр. proper(string) string Переводит первый символ строки в верхний регистр, остальные в нижний. explode(string, string) vector Разделяет строку по указанным разделителям во втором аргументе и создает из получившихся строк вектор (массив). Пример: explode("строка1 строка2 строка3 строка4") создаст вектор с четырьмя элементами: "строка1", "строка2", "строка3", "строка4". Широко используется в командах чата: if(at(explode($content, " "),1)=="/bot"){ код } выполнит код, если первое слово будет "/bot". repeat(string, number) string Повторяет строку n(второй аргумент) раз. reverse(string) string Переворачивает строку. "строка" станет "акортс". tonum(string) number Преобразует строку в число.
Функции работы с векторами[]
Векторы (массивы) представляют собой контейнеры, в которых можно хранить различные элементы одного типа. В основном используются в качестве списков. Все элементы вектора нумеруются, начиная с 1. К любому элементу вектора можно получить доступ, зная его индекс - номер.
Синтаксис Возвращаемое значение Описание vector(...) vector Возвращает вектор с заданными элементами. Может быть пустым. at(vector, number, var) var Задает элемент вектора (первый аргумент) по индексу (второй аргумент) значением (третий аргумент). Если в указанном элементе вектора уже есть значение эквивалентное третьему аргументу, то функция вернет это значение. copy(vector, number, number) vector Возвращает копию вектора в указанном диапазоне индексов. push_back(vector, ...) Добавляет значения в конец вектора в первом аргументе. Функция устарела, и вместо нее используют оператор += remove(vector, ...) Удаляет из вектора элементы, значения которых равны аргументам. cut(vector, number, number) Удаляет из вектора указанный диапазон элементов. swap(vector, number, number) Меняет элементы вектора, указанные в 2 и 3 аргументах местами. insert(vector, number, var) Вставляет значение var после элемента number в векторе vector. find(vector, var) var Ищет указанное значение в векторе, возвращает 0, если ничего не найдено. length(vector) number Возвращает длину вектора (число его элементов)
Различные функции[]
Синтаксис Взвращаемое значение Описание pick(...) var Возвращает случайно выбранное значение из аргументов. time() number Возвращает реальное время сервера в виде числа. timestamp(format) string Возвращает форматированное время и/или дату, формат передается в качестве аргумента. Например: "DDD MMM DD hh:mm:ss YYYY" или "hh:mm:ss" или "DD MM YY".
Заранее готовые переменные[]
PI = 3.141592653; E = 2.718281828; SQURT2 = 1.414213562; FALSE = 0; // true/false это лишь соответствия для 1 и 0 TRUE = 1; NORTH = 1; SOUTH = 2; EAST = 4; WEST = 8; // радиочастоты $common = 1459 $science = 1351 $command = 1353 $medical = 1355 $engineering = 1357 $security = 1359 $supply = 1347 HUMAN = 1 MONKEY = 2 ALIEN = 4 ROBOT = 8 SLIME = 16 DRONE = 32
Использование в Телекоммуникациях[]
NTSL широко используется в Системе Контроля Трафика (Traffic Control Systems) сервера
Изменение сигналов в реальном времени[]
Если код будет исполняться автоматически, сигналы будут сначала выполнять заложенный в сервер код. Информация о сигнале хранится в следующих переменных:
$source // источник сигнала $content // содержимое сигнала $freq // частота сигнала $pass // определяет, будет ли сигнал транслироваться $job // профессия оператора (только радиосообщения) $language // Язык сигнала. Может быть HUMAN, MONKEY, ALIEN, ROBOT, SLIME или DRONE. Или сочетать эти языки.
Функции[]
СКТ предоставляется со встроенными функциями. Аргументы могут быть опущены, и СКТ определит их автоматически.
broadcast()[]
broadcast(сообщение, частота, источник, профессия)
Передает сигнал к вещателю
сообщение: Радиосообщение
частота: Частота передачи
источник: Имя оператора. Если имя не находится в базе на стороне сервера, имя будет написано курсивным шрифтом и в верхнем регистре, показывая, что голос синтезирован.
профессия: Профессия оператора.
Примеры:
broadcast("Hello world!");
стандартные параметры:
частота: 1459
источник: имя сервера
профессия: нет
broadcast("Помогите, меня грифят!", 1459, "Burer", "Security Officer");
signal()[]
signal(частота, код)
Отправляет сигнал с заданным кодом как Remote Signaller.
частота: частота отправления.
code: код сигнала.
Примеры:
signal(1359, 25);
стандартные параметры:
частота: 1459
код: 30
mem()[]
mem(ключ, значение)
Переменные, созданные в скрипте теряются после выполнения скрипта. Функция mem позволяет записать нужное значение в память сервера для последующего использования. Каждый сервер телекома имеет собственную базу данных, представляющую собой словарь - структуру данных, состоящую из ячеек формата "ключ-значение" (key-value). Когда функция вызывается только с аргументом "ключ", она возвращает значение, соответствующее ключу. Если функция вызывается с двумя аргуметами, то она запишет в память сервера значение, ассоциированное с ключом.
ключ: Идентификатор данных.
значение: Записываемая информация. Может быть любого типа.
Примеры:
$source = "Jarsh Mellow"; mem("мать " + $source"); // возвращает значение, ассоциированное с ключом "мать Jarsh Mellow", возвращает 0, если значения нет. mem("мать " + $source", "Lindsay Donk"); // задает значение "Lindsay Donk", ассоциированное с ключом "мать Jarsh Mellow".