Перейти к содержимому

Операторы и выражения

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

Идентификаторы

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

Ключевые слова

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

Ниже перечислены все зарезервированные ключевые слова:

setin
globalas
ifdo
elseifverbatim
elsefilter
endifendfilter
fornull
endforis
truenot
falsewith
emptyrequire
returnreturning
includemacro

Выражения доступа

Значения списков и карт

Для получения доступа к элементу списка или значению ключа карты используется индекс элемента списка или название ключа карты, заключенные в квадратные скобки []. Индексы списков всегда начинаются с 0.

JuniperBot Template
{{ list[0] }}
{{ map["key1"] }}

WARNING

Выражения получения доступа к элементам списка или значению ключа карты в комбинации с бинарными операторами очень чувствительны к скобкам.

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

Свойства и методы

Для получения доступа к свойству какого-либо объекта или вызова метода этого объекта, используется оператор выбора . (точка). Допустимые свойства и методы описаны в разделах Переменные и Типы данных.

JuniperBot Template
{{ guild.name }}
{{ guild.getMember(247734710682255361) }}

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

JuniperBot Template
{{ map.key1 }}

Сложные выражения

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

Операторы шаблонного движка делятся на несколько групп:

  1. Унарные операторы;
  2. Бинарные операторы;
  3. Тернарный оператор;
  4. Оператор Элвиса.

Порядок вычисления

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

Для изменения порядка вычисления, заданного приоритетом операторов, можно использовать скобки.

Более подробно о приоритетах выражений читайте в статье Приоритет выражений.

TIP

Чем меньше число, тем выше приоритет оператора, тем раньше он вычисляется.

Унарные операторы

Унарные операторы по определению нуждаются только в одном аргументе, шаблонизатор JuniperBot содержит только два встроенных унарных оператора: not и -.

СимволОписаниеПриоритетПример
-Меняет знак95-(-1) выводит 1
notОтрицание100not false выводит true
not true выводит false

Бинарные операторы

Шаблонный движок JuniperBot поддерживает следующие бинарные операторы:

TIP

Чем меньше число, тем выше приоритет оператора, тем раньше он вычисляется.

СимволПриоритетОписаниеПример
.101Получение доступа к свойствам объектовmember.id выводит идентификатор участника
^103Возводит число в степень2 ^ 3 выводит 8
*105Умножение двух значений2.2 * 2.2 выводит 4.84
**105Целочисленное умножение двух значений2.2 ** 2.2 выводит 4
/105Деление двух значений5.0 / 2.0 выводит 2.5
//105Деление двух значений с округлением до целого5.0 // 2.0 выводит 3
%105Получение остатка от деления5 % 2 выводит 1
+110Суммирует два значения5 + 2 выводит 7
-110Вычитает два значения5 - 2 выводит 3
~112Объединяет две строки"5" ~ "2" выводит "52"
<115Сравнивает два значения, проверяя меньше ли первое значение второе1 < 2 выводит true 1 < 1 выводит false
<=115Сравнивает два значения, проверяя меньше или равно ли первое значение второму2 <= 2 выводит true 2 < 1 выводит false
>115Сравнивает два значения, проверяя больше ли первое значение второго2 > 1 выводит true 2 > 2 выводит false
>=115Сравнивает два значения, проверяя больше или равно ли первое значение второму2 >= 2 выводит true 2 >= 3 выводит false
in115Проверяет, содержится ли значение в списке5 in [2] выводит false
==120Проверяет два значения на их равенствоtrue == false выводит false false == false выводит true
!=120Проверяет два значения на их неравенствоtrue != false выводит true false != false выводит false
and125Оператор конъюнкции (И)true and false выводит false true and true выводит true
or125Оператор дизъюнкции (ИЛИ)true or false выводит true false or false выводит false
|130Использует первый аргумент как параметр к названию функции во втором аргументе-5 | abs выводит 5
:=140Вычисляет и возвращает значение второго аргумента, присваивая его переменной в первом аргументе. Подробнее.result := 1 + 2 выводит 3, присвоя это же значение переменной result

Оператор присваивания

Оператор присваивания (так называемый моржовый оператор :=) относится к группе бинарных операторов и позволяет одновременно присвоить значение переменной и вернуть его.

JuniperBot Template
{{ <переменная> := <выражение> }}

Моржик вычисляет значение выражения, записывает его в переменную и возвращает это же значение.

JuniperBot Template
{{ result := 1 + 2 }}
{{ result }}

Пример выше распечатает "3" два раза. Первая тройка - результат вычисления выражения присваивания, а вторая - значение переменной result в результате вычисления этого выражения.

Этот оператор очень полезен для сокращения кода в некоторых ситуациях. Например, представим простой шаблон с использованием обычного тэга set для присваивания переменной:

JuniperBot Template
{% set amount = 5 %}
{% if amount > 0 %}
У Пети есть целых {{ amount }} яблок!
{% endif %}

Этот шаблон можно сократить таким образом:

JuniperBot Template
{% if (amount := 5) > 0 %}
У Пети есть целых {{ amount }} яблок!
{% endif %}

Приоритет присваивания

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

Если выражение сравнения в примере выше было бы записано как amount := 5 > 0, то значение переменной amount было бы не 5, а true, поскольку согласно приоритетам оператор сравнения вычисляется в первую очередь. Именно поэтому для изолирования выражения присваивания используются скобки.

Сам по себе оператор присваивания не может объявлять глобальные переменные, но если переменная с указанным названием уже существует и она является глобальной, то оператор присваивания обновит значение этой переменной, оставив её при этом глобальной.

Тернарный оператор

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

JuniperBot Template
{{ <выражение> ? 1 : 2 }}

Такой блок выведет 1, если результат вычисления выражения равен true и 2, если false.

Оператор Элвиса

Оператор Элвиса возвращает результат вычисления первого выражения в случае, если оно имеет значение истины согласно Конвертации типов, в противном случае возвращает результат вычисления второго выражения.

JuniperBot Template
{{ <выражение A> ?: <выражение Б> }}

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

TIP

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

Тестовые выражения

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

НазваниеОписаниеПример
NullПроверяет, является ли значение1 is null выводит false
DivisibleПроверяет, можно ли поделить первое значение на второе2 is divisible by 1 выводит true
Same AsПроверяет, являются ли два объекта одним и тем же объектом по ссылке1 is same as (2) выводит false
Function basedПроверяет результат вычисления функции над указанным аргументом.4 is defined выводит true;
'test' is number выводит false.
Is NotВ любых конструкциях выше можно использовать отрицание is not.4 is not defined выводит false

Тестовое выражение "Same As"

Данное выражение проверяет равность объектов по их ссылке, а не просто по значению. Например:

JuniperBot Template
{{ 1 is same as (1) }}

Данный пример распечатает false. Да, это два одинаковых числа 1, но это разные экземпляры этого числа, имеющие разные ссылки. Теперь взгляните на этот шаблон:

JuniperBot Template
{% set value = 1 %}
{% set other = value %}
{{ value is same as (other) }}

Этот шаблон распечатает true, потому что обе переменные value и other ссылаются на один и тот же экземпляр числа.

Однако это работает для null:

JuniperBot Template
{{ null is same as (null) }}

Этот шаблон распечатает true, потому что нулевая ссылка всегда одна и та же.

Все права зафырканы.