YOLOL

## **Введение**

**YOLOL** - это язык программирования, который используется в игре.
Код написан на строках в YOLOL chips, которые позже могут быть вставлены в chip sockets, которые принимают и передают сообщения.
Этот язык позволяет программировать и управлять практически любым устройством в пределах известной вселенной.

## **Базовая информация**

Код записывается и приводится в исполнение на специальных чипах, которые могут использоваться как для мониторинга, так и для управления электрическими устройствами, подключенными к сети.

Простыми словами:

1. Код начинает выполняться со строки 1
2. После прочтения строки 1 он переходит к следующей строке с интервалом, установленном в самом чипе
3. Затем всё вышесказанное повторяется для каждой последующей строки (2, 3, 4...)
4. Если дополнительных параметров нет, то после выполнения последней строки весь процесс повторяется.

## **Краткий справочник**

### **Регистр**

Этот язык полностью игнорирует **CAPS LOCK**.

Это значит, что:

**if ButtonState == 1 then DoorState = 1 end** и **IF buttonstate == 1 THEN doorstate = 1 END**

Между собой равны и поэтому имеют один и тот же смысл. Так что можно писать как прописными, так и строчными буквами делая текст красивее и понятнее или наоборот.

### **Переменные**

Этот язык относится к слабо типизированным и поддерживает всего два типа данных: **Дроби с фиксированной запятой** (до 0.001) и **Строки.**

Проще говоря переменные могут быть введены как строки или числа игнорируя ранний тип переменной, если предыдущий тип не идентичен, не вызывая ошибки.

Каждая переменная имеет один тип и может быть преобразована в другой.

Переменная без начального значения всегда равна 0, а значения null не существует в принципе.

За True отвечает значение не равное нулю, а за False равное нулю. (**True =! 0 False == 0**).

Присвоение значения переменной всегда преобразует переменную в тип присвоенного значения. Например, **ultimateAutopilot= 128.6432** приводит к переменной **ultimateAutopilot** содержащей числовое значение **128.6432.** А в результате выполнения команды **ultimateAutopilot= "Error prone"** переменная **ultimateAutopilot** становится строковой переменной и её числовое значение **128.6432** удаляется.

### **Дроби**

Числовые значения на этом языке программирования - это 64-разрядные целые числа. Переменные содержат десятичные числа до четырёх символов.

**Например, pieVariable= 3.1415** присваивает переменной **pieVariable** значение **3.1415**. Но при **pieVariable= 0.5772156649** переменной присваивается значение **0.5772.** То есть значение обрезается и оставляет только четыре десятичных числа.

### **Строки**

Чтобы указать строковый литерал на этом языке надо заключить в кавычки нужное значение. Например, **badRobots= "saltberia"** присваивает переменной **badRobots** значение **saltberia.**

### **Внешние переменные**

Внешние переменные в этом языке используются с синтаксисом **:VariableName**.

Префикс двоеточия (**:**) используется для сообщения скрипту о доступе к внешней переменной вместо использования переменной, которая может быть объявлена или которая не используется в самом скрипте.

Чип который подключен к устройству имеет доступ ко всем устройствам подключённым к одной сети.

Например, **if :ButtonState == 1 then :DoorState = 1 end** отправит значение **1** на любые устройства которые получают команды от множества устройств **DoorState** если значение **ButtonState** в сети равно **1**.

### **Операторы и команды**

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

### **Логические операторы**

Логические операторы определяют, является ли оператор True или False.

Все логические операторы отправляют в качестве ответа **0 если False** и **1 если True.**

 A > B
 A <= B
 A >= B
 A ~= B
 A == B

Можно так же использовать ключевые слова **not**, **and** и **or** для более тонкой настройки сложных условий.

### **Смешивание типов переменных в операциях**

Смешивание типов переменных в операциях обрабатывает операцию используя ВСЕ параметры в виде строк.

Например, **previouslyNumber= "10" + 15** будет представлен как **previouslyNumber= "1015"**. Сами значения при этом не изменяются.

Если взять **purelyNumber = 15** и **purelyString = "10" + purelyNumber** , то в конце концов **purelyString** будет равен **1015**, а **purelyNumber** останется равен **15**.

### **Goto**

Синтаксис Goto используется, когда порядок чтения скрипта от 1->20 не требуется или должен быть изменён.

Оператор goto использует синтаксис **goto lineNumber**, где **lineNumber** - строка, в которой команда будет выполнять скрипт. Любой скрипт после команды **goto** не будет выполнен. Использования оператора **IF** перед **goto** будет игнорировать goto**.** Можно добавить несколько команд goto в одну строку при помощи условных обозначений.

При **If variable == 5 then goto 4 end goto 6** скрипт перейдёт в строку **4**, если переменная имеет значение **5**. В противном случае он перейдёт в строку **6**.

### **If-else условности**

Операторы If-else используются для разветвления скрипта на несколько разных путей. Они используют синтаксис **if *условие* then *оператор* else *оператор* end**. **Условие** - это оператор, который приводит к числовому значению (где **0 - False**, a **1 - True**). А **операторы** - части скрипта, которые выполняются. Все **if-else** условности должны иметь **end** в конце.

Например, **if variable ~=2 then endResult = 3 else endResult = 4 end.** Этот скрипт устанавливает значение **endResult** равное **3,** если переменная не равна **2.** Если же значение переменной равно **2**, то **endResult** будет равен **4**. Интересно, что **else** может не использоваться. Например, скрипт **if variable ~= 2 then endResult = 3 end** устанавливает значение **3** только в **endResult,** если переменная не имеет значения **2** и не выполняет другие команды.

#### **Вложенные утверждения if-else**

Можно разместить **утверждения if-else** внутри блоков **True/False** для того чтобы создавать более разветвлённые схемы.

Например, скрипт **if Variable == 0 then endResult = 1 else if Variable == 1 then endResult = 2 end end** ставит **endResult** равным **1**, если **Variable** приравнена к **0**. Если же если **Variable** не равна **0**, но равна **1**, то **endResult** будет равен **2**.

Второй пример. **if Varibale == 0 then if endResult = 2 end else andResult = 1 end**. При этом скрипте значение **endResult** будет равно **2** если **Variable**имеет значение **0**, а **endResult** равен **1**. В противном случае **endResult** будет равен **1**.

Cледует акцентировать внимание на том, что планировать и исправлять баги скриптов, форматировать скрипты содержащие **if** в гораздо красивой и приятной форме. Также следует обратить внимание, что такой скрипт **не будет** работать на чипах, но может быть довольно полезно при форматировании скриптов.

Пример для форматирования скрипта:

**if variable == 0 then**

**if otherVariable == 1 then**

**otherVariable = 2**

**end**

**else**

**otherVariable = 1**

**end**

### **Примечания**

Комментарии можно оставлять под своими кодами, которые будут использованы другими людьми. Комментарии используют заранее выделенное пространство длинной в 70 символов.

Комментарии выделяются следующим синтаксисом **//text** текст может быть любым однострочным набором символов.

## **Ошибки**

Существует два типа ошибок:

1. Синтаксические ошибки (Syntax errors)
2. Ошибки выполнения (Runtime errors)

Синтаксические ошибки происходят из-за того, что был использован недопустимый скрипт и приводят к тому, что вся строка не выполняется.

Ошибки выполнения происходят только во время выполнения самого скрипта. Они приводят к прерыванию выполнения строки скрипта, но любые действия выполненные до этой ошибки сохраняются.