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, который имеет следующую структуру:

  1. Ключевое слово for.
  2. В круглых скобках: объявление переменной через let, за которым следует имя переменной, ключевые слова from и to с указанием начального и конечного значения.
  3. Тело цикла заключено в фигурные скобки, внутри которых содержится список операторов.

Пример:

  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>

Выражение может содержать

  • вызов функции
  • тернарный оператор
  • индетификатор
  • строковый литерал
  • числовой литерал
  • другое выражение в скобках
  • бинарный оператор применнённый к двум выражениям.

Приоритет операторов (упорядочены от самого низкого, до самого высокого):

  1. Тернанрый оператор
  2. ==, !=
  3. >=, >, <=, <
  4. +, -
  5. /, *, %

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

  <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