Отличия шага Установить переменную и SmartQuery

Исторически сложилось так, что в SmartBot есть 2 разных способа для вычисления значений выражений с переменными: шаг "Установить переменные" и SmartQuery (SQ, шаг Выполнить SmartQuery).

Про шаг "Установить переменную"

Изначально был только шаг "Установить переменные". Его основная задача — сохранять текст в переменную. Так, например, с его помощью можно сохранить ответ пользователя из переменной %сообщение% в какую-то локальную переменную.

Также можно использовать этот шаг для сохранения меток пользователей, например:

Ещё этот шаг позволяет производить несложные арифметические вычисления с переменными. Например, если вам нужно считать, сколько раз бот выполнил определённый шаг для каждого пользователя, это можно сделать так:

Подробное описание возможностей этого шага можно посмотреть тут: Операции с переменными.

Алгоритм работы этого шага можно описать следующим образом:

  1. Подставляем значения переменных (в виде текста) в правую часть выражения

  2. Результирующую строку пытаемся выполнить как арифметическое выражение

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

  4. Иначе оставляем всё как было - текстом, полученным в п.1

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

Рассмотрим на примере. Пусть у нас есть 2 переменные: %a% и %b%. Допустим, их значения вводит пользователь.

%a%

%b%

Выражение

Результат

10

10

%a% + %b%

20

10

10ш

%a% + %b%

10 + 10ш

Видно, что во втором случае выражение не удалось вычислить (из-за "ш"), и оно осталось не вычисленным, хоть переменные и были подставлены. Другим негативным примером может быть кейс, когда пользователь в переменную занесёт что-то, что может быть проинтерпретировано как арифметическое выражение. Возможно вы не хотите его вычислять, просто хотите сохранить как есть. Но сделать этого не можете, потому что SmartBot всегда пытается вычислить выражение в правой части шага Установить переменную.

%сообщение%

Выражение

Результат

20 * 2

%сообщение%

40

Кроме того, так как этот шаг всегда подставляет переменные в виде текста, вы не можете работать с массивами и словарями в этом шаге без SQ.

Про шаг "Выполнить SmartQuery"

SmartQuery — это встроенный в SmartBot скриптовый язык программирования со строгой динамической типизацией. Во многом он похож на Python.

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

Приведём несколько примеров:

Значением переменной %var1% будет строка 2 * 2, %var2% — число 4, %var3% — строка из переменной %сообщение%. При этом даже если в %сообщение% будет записано арифм. выражение оно не будет вычислено, потому что строка есть строка, строка — это не выражение.

С помощью SQ можно сделать всё, что можно сделать с помощью "Установить переменную" и гораздо больше, но синтаксис сложнее.

Подробнее про SQ можно почитать тут: Введение. Документация: Справочник функций.

Список отличий

  • Выражения на SQ можно использовать везде, не только в шаге "Выполнить SmartQuery" и в сложных условиях, но и в тексте сообщений, рассылок и т.п. Для этого выражение нужно обернуть в двойные фигурные скобки. Это говорит смартботу, что вместо выражения нужно подставить его текстовое представление результата его вычисления в текст сообщения. Таким образом всё, что находится внутри {{ }} — это выражение на языке SQ, и оно будет вычислено, а всё что снаружи — это просто текст. Обратите внимание, что в шаге "Выполнить SmartQuery" и в сложных условиях фигурные скобки ставить не нужно: там всё поле ввода — это одно выражение на SQ, а не текст.

  • В шаге "Установить переменную" можно использовать такие переменные как %ранд(a, b)% и %дата+N%. В целом, не очень корректно их называть переменными, но так сложилось исторически. В SQ они недоступны, потому что противоречат синтаксису этого языка программирования. Вместо них в SQ есть функция rand(a, b). Кроме того, она также позволяет получить случайное значение из массива. Альтернативы для второй переменной в SQ на данный момент нет.

  • В шаге Установить переменную тоже можно использовать SQ -- в фигурных скобках, также как и везде, где можно использовать обычные переменные. Но скорее всего, удобней будет всё же воспользоваться шагом "Выполнить SmartQuery".

  • Так как в "Установить переменную" подстановка переменных идёт перед вычислением выражения, то для того, чтобы склеить 2 строки вместе вам просто нужно написать их подряд. Тут нет никакого спец. синтаксиса. Смартбот не сможет вычислить это выражение как арифметическое, и просто ограничится подстановкой значений переменных в текст.

  • В SQ того же результата будет добиться гораздо сложнее