15. Выражения и шаблоны

Две вкладки окна аргумента, в которых значение не берётся готовым, а вычисляется. Язык вычислений — серверный: редактор его подсвечивает и проверяет, но не исполняет (Выражение, Функция).

Редактор выражения

Редактор выражений с деревом функций
Figure 1. Вкладка «Выражение»

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

Имя переменной пишется в квадратных скобках: [dtmf], [sitedomain]. Строки — в двойных кавычках. Всё остальное — функции и операторы.

Одинарные кавычки — не замена двойным. Синтаксис языка в основе своей эрланговский, и текст в одинарных кавычках становится атомом. Атомы на сервере ограничены и по количеству, и по длине: короткая строка пройдёт, а большой JSON в одинарных кавычках разместить не удастся.

Правило простое: строки — только в двойных кавычках.

Дерево функций

Дерево функций
Figure 2. Раскрытая группа функций

Дерево устроено по разделам: переменные этого сценария, общие функции по темам (математика, строки, дата и время, преобразования, хеши, файлы, доступ), константы и символы, функции конкретного вида сценария.

Рядом с каждой группой — сколько в ней функций. У каждой функции показаны имя и типы параметров: substr (str,int,int). Клик вставляет вызов в текст на место курсора.

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

Переменные сценария лежат в дереве первым разделом. Вставлять их оттуда надёжнее, чем печатать руками: имя подставится ровно так, как оно записано, вместе со скобками.

Шаблон

Редактор шаблонов
Figure 3. Вкладка «Шаблон»

Шаблон — это обычный текст, в котором участки в двойных фигурных скобках вычисляются как выражения:

Здравствуйте, {{ str([name]) }}. Ваш баланс {{ str([sum]) }} рублей.

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

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

Если сценарий пришёл со старой записью шаблона — одинарными скобками, — редактор переведёт его в двойные и скажет об этом строкой под полем. Это не правка «за вас»: пока вы не нажали Сохранить, в сценарии ничего не изменилось.

Проверка на сервере

Свои правила разбора редактор не выдумывает: язык принадлежит серверу, и проверяет выражение он же.

Ошибка проверки выражения
Figure 4. Сервер вернул ошибку

Проверка идёт, когда вы уходите из поля, и ещё раз — при сохранении значения. Ошибка показывается так, как её сформулировал сервер: рамка поля краснеет, под ним появляется сообщение.

Что важно знать:

  • ошибка не запрещает сохранить. Редактор предупреждает, а не сторожит: бывает, что сервер отвечает не то, а работа стоять не должна;

  • при обрыве связи проверки нет. Ответ не пришёл — сообщение не показывается. Отсутствие ошибки при потерянной связи ничего не доказывает;

  • ответ запоминается. Открыв то же выражение снова, вы увидите уже известную ошибку без нового запроса.

Несколько действий в одном выражении

У языка эрланговский синтаксис, и операторы в нём разделяются запятыми. Значением выражения становится последний из них. Это открывает приём, о котором стоит знать заранее, — функцию component.

component выполняет прямо внутри выражения типизированный компонент сценария со свойствами, заполненными здесь же, в редакторе выражений, дожидается его завершения и передаёт управление следующему оператору. То есть кусок сценария можно записать не квадратами на карте, а последовательностью внутри одного аргумента.

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

Ограничения тоже есть: произвольные внешние методы эрланга из выражения не вызываются — для этого нужна отдельная настройка разрешений на сервере. Подробности — Выражение и Функция.

Что стоит помнить

  • Выражение всегда возвращает одно значение. Ветвление делается компонентами на карте, а не формулой.

  • Приведение типов явное: str(…​) для строки, num(…​) для числа. Молчаливого приведения не будет.

  • Незаданная переменная — не пустая строка и не ноль. Сравнивать с ней бессмысленно; проверяйте [x] == null.

  • Длинное выражение — повод завести переменную и разбить вычисление на два шага. Читать сценарий будете вы же.

◀ 14. Аргумент

16. Меню и переводы ▶