LoveScript
LoveScript — язык программирования для выражения тёплых и романтических чувств. В его основе лежит метафора любви как алгоритма: отношения — это процессы, эмоции — переменные, а признания — выводимые строки. LoveScript создан, чтобы превращать логику в романтику, а код — в признания.
Общие понятия
Холст, которым оперирует LoveScript, имеет квадратное соотношение сторон. На холсте введена декартова система координат: ось X направлена слева направо, а ось Y — сверху вниз. Центр координат расположен в левом верхнем углу. Правый нижний угол имеет координаты (1, 1)
. Все размеры также указываются в этих координатах, таким образом, size = 1
обозначает объект размером в 100% холста.
Синтаксис языка
Синтаксис языка описывается следующей формальной грамматикой. Ниже приведены нетерминальные символы и правила их построения. Между любыми двумя элементами грамматики (кроме элементов образующих литералы и идентификаторы) может находиться произвольное колличество пробельных символов, символов табуляции и символов переноса строки.
Стартовый символ
<start> ::= <list>
Программа является списком операторов.
Список операторов
<list> ::= <statement> <list> | ε
Список операторов (statement) может состоять из:
- одного оператора , за которым может следовать список операторов;
- либо быть пустым (ε).
Оператор (statement)
<statement> ::= <for> | <if> | <using> | <call>
Оператор может быть:
- циклом for,
- условным оператором if (с возможным блоком else),
- блоком using,
- вызовом функции
Цикл for
<for> ::= 'for' '(' 'let' <identifier> 'from' <number> 'to' <number> ')' '{' <list> '}'
Правило описывает цикл for, который имеет следующую структуру:
- Ключевое слово for.
- В круглых скобках: объявление переменной через let, за которым следует имя переменной, ключевые слова from и to с указанием начального и конечного значения.
- Тело цикла заключено в фигурные скобки, внутри которых содержится список операторов.
Пример:
for (let i from 1 to 10) {
...
}
Условный оператор if
<if> ::= 'if' '(' <expression> ')' '{' <list> '}'
[ 'else' '{' <list> '}' ]?
Условная конструкция начинается со слова if, за которым в круглых скобках указывается выражение. Затем следует блок оператора if (тело if) в фигурных скобках. Необязательная часть else, также заключённая в фигурные скобки, выполняется, если условие ложно.
Пример:
if (i % 2 == 0) {
...
} else {
...
}
Блок using
<using> ::= 'using' '(' <expression> ')' '{' <list> '}'
Конструкция using используется для применения глобальных настроек. В круглых скобках задаётся выражение, задающее глобальные настройки, а тело блока (в фигурных скобках) содержит список операторов, которые будут исполнены с применёнными глобальными настройками.
Пример:
using (blendMode(value = 'multiply')) {
...
}
Выражения
<expression> ::= <call> |
<expression> '?' <expression> ':' <expression> |
<identifier> | <string> | <number> |
'(' <expression> ')' |
<expression> ('==' | '!=' | '>=' | '>' | '<=' | '<' | '+' | '-' | '/' | '*' | '%') <expression>
Выражение может содержать
- вызов функции
- тернарный оператор
- индетификатор
- строковый литерал
- числовой литерал
- другое выражение в скобках
- бинарный оператор применнённый к двум выражениям.
Приоритет операторов (упорядочены от самого низкого, до самого высокого):
- Тернанрый оператор
==
,!=
>=
,>
,<=
,<
+
,-
/
,*
,%
Вызов функции
<call> ::= <identifier> '(' <arguments> ')'
Вызов функции начинается с идентификатора функции, за которым следуют круглые скобки с аргументами.
Аргументы функции
<arguments> ::= <argument> [, <argument>]* | ε
Аргументы — это список аргументов, разделённых запятой. Список аргументов может быть пустым.
<argument> ::= <identifier> '=' <expression>
Каждый аргумент имеет вид: имя параметра (идентификатор), знак «=» и значение (выражение).
Строковые литералы
<string> ::= "'" <string_contents> "'"
Строка заключается в одинарные кавычки.
<string_contents> ::= <string_char>*
<string_char> ::= [^\\'] | ('\\' .)
Внутри строки могут присутствовать любые символы, за исключением одинарной кавычки и обратного слэша (если они не экранированы).
Числовые литералы
<number> ::= '-'? [0-9]* '.' [0-9]+ | '-'? [0-9]+ ('.' [0-9]+)?
Число состоит из опционального знака «-» в начале, далее идут опциональные целая часть и дробная часть, однако либо целая часть либо дробная часть обязательно должны быть.
Идентификаторы
<identifier> ::= [a-zA-Z_][a-zA-Z_0-9]*
Идентификаторы должны начинаться с буквы латинского алфавита или символа подчёркивания, а затем могут содержать буквы, цифры или подчёркивание.
Типы данных
number
Числа представлены в виде 64-битного формата IEEE-754.
color
Описывает цвет. На уровне программы описывается как строковый литерал, содержащий цвет в hex формате, либо как строковый литерал описывающий один из заранее заготовленных цветов:
'transparent'
'red'
'green'
'blue'
'yellow'
'ping'
'black'
'white'
bg
Описывает фон. Напрямую задать в виде литерала нельзя, можно только получить его из функции.
using
Описывает глобальные настройки. Напрямую задать в виде литерала нельзя, можно только получить его из функции. Для применения настроек необходимо передать их в блок using
Доступные функции
radialGradient
- Описание: Возвращает фон с радиальным градиентом состоящим из двух цветов: начального (start) и конечного (end).
- Аргументы:
- start (color, обязательный): Начальный цвет градиента.
- end (color, обязательный): Конечный цвет градиента.
- Возвращает: bg
linearGradient
- Описание: Возвращает фон с линейный градиентом состоящим из двух цветов: начального (start) и конечного (end), а также с углом наклона (angle).
- Аргументы:
- start (color, обязательный): Начальный цвет градиента.
- end (color, обязательный): Конечный цвет градиента.
- angle (number, обязательный): Угол наклона градиента в градусах против часовой стрелки.
- Возвращает: bg
solidBackground
- Описание: Возвращает одноцветный фон.
- Аргументы:
- color (color, обязательный): Цвет фона.
- Возвращает: bg
pattern
- Описание: Добавляет на задний план шаблоны указанного цвета.
- Аргументы:
- type (string, обязательный): Тип шаблона. Допустимые значения: 'triangle', 'circle', 'rhomb', 'heart', 'flower', 'star', 'square'.
- color (color, обязательный): Цвет шаблона.
- size (number, обязательный): Размер элемента шаблона (от 0.01 до 1).
- space (number, обязательный): Пробел между элементами (от 0 до 1).
- angle (number): Угол наклона шаблона.
- Возвращает: void
fill
- Описание: Заполняет задний план фоном (bg).
- Аргументы:
- bg (bg, обязательный): Объект фона.
- Возвращает: void
heart
- Описание: Рисует сердце, используя фон (bg) и размер.
- Аргументы:
- bg (bg, обязательный): Объект фона.
- size (number, обязательный): Размер сердца (от 0.01 до 1).
- x (number): Позиция по оси X.
- y (number): Позиция по оси Y.
- vertices (number): Количество вершин (от 3 до 64).
- distort (number): Искажение формы (от 0 до 10).
- borderWidth (number): Толщина границы (от 0 до 0.2).
- borderColor (color): Цвет границы.
- Возвращает: void
alpha
- Описание: Устанавливает глобальную прозрачность для всех элементов в процентах.
- Аргументы:
- value (number, обязательный): Значение прозрачности (от 0 до 100).
- Возвращает: using
blendMode
- Описание: Устанавливает глобальную операцию композиции, определяемую значением (value).
- Аргументы:
- value (string, обязательный): Режим смешивания. Допустимые значения: 'source-over', 'lighter', 'multiply', 'screen', 'overlay', 'darken', 'lighten', 'color-dodge', 'color-burn', 'hard-light', 'soft-light', 'difference', 'exclusion', 'hue', 'saturation', 'color', 'luminosity'
- Возвращает: using
transform
- Описание: Устанавливает глобальное преобразование для всех элементов. Доступные преобразования: translateX, translateY, rotate, scale, skew, skewX, skewY. Все преобразования применяются относительно центра холста
(0.5, 0.5)
. - Аргументы:
- translateX (number): Смещение по оси X.
- translateY (number): Смещение по оси Y.
- rotate (number): Поворот по часовой стрелке. Указывается в градусах.
- scale (number): Изменяет масштаб.
- scaleX (number): Изменяет масштаб вдоль оси X.
- scaleY (number): Изменяет масштаб вдоль оси Y.
- skew (number): Аналогично skewX (от -85 до 85).
- skewX (number): Искажает элемент сдвигая его части вдоль оси X. Указывается в градусах (от -85 до 85).
- skewY (number): Искажает элемент сдвигая его части вдоль оси Y. Указывается в градусах (от -85 до 85).
- Возвращает: using
rgb
- Описание: Комбинирует численные значения красного, зелёного и сенего в один цвет
- Аргументы:
- r (number, обязательный): Красная компонента (от 0 до 255).
- g (number, обязательный): Зелёная компонента (от 0 до 255).
- b (number, обязательный): Синяя компонента (от 0 до 255).
- a (number): Альфа канал (от 0 до 1).
- Возвращает: color
hsl
- Описание: Комбинирует численные значения тона, насыщенности и светлоты в один цвет
- Аргументы:
- h (number, обязательный): Тон (от 0 до 360).
- s (number, обязательный): Насыщенность (от 0 до 100).
- l (number, обязательный): Светлота (от 0 до 100).
- a (number): Альфа канал (от 0 до 1).
- Возвращает: color