i = 0
sum = 0
while (i < 10) {sum += i
    i += 1
}
for (i = 0; i < 10; i += 1) {
    sum += i
}

Циклы и условия можно свободно вкладывать друг в друга.

  1. break — досрочный выход из цикла
  2. continue — переход к следующей итерации:
found = -1
for (i = 0; i < arr_len(items); i += 1) {
    if (items[i] == target) {
        found = i
        break
    }
}

for (;;) { ... } — бесконечный цикл (до лимита).

Защита от зацикливания: на один блок переменных — суммарно не более 256 итераций всех циклов. При достижении лимита циклы останавливаются, блок продолжает работать дальше. Досрочный break экономит этот лимит.

Как сохраняются переменные

  1. Внутри цикла значения обновляются мгновенно: условие цикла и каждая следующая строка видят актуальные данные.
  2. Сохраняются только финальные значения — один раз, после завершения цикла (в том числе через break). Независимо от количества итераций, запишется только итог.
  3. Если внутри цикла произошла ошибка, то изменения из цикла не сохраняются вовсе. Значения итераций временные, сохранённым останется то, что было до входа в цикл.
  4. Переменная цикла for (например, i) — служебная. Живёт только внутри цикла, никогда не сохраняется и исчезает после его завершения.

Локальные переменные

Ключевое слово local создаёт служебную переменную: она работает во всех расчётах до конца блока, но никогда не сохраняется в карточку клиента, поэтому не нужно потом чистить временные tmp и buf через del.

local tmp = get(#{data}, 'items')
local count = arr_len(tmp)
if (count > 5) {
    result = 'много'
}

Если у клиента есть обычная переменная с тем же именем — она останется нетронутой: local просто временно её заслонит.

Операторы += и -=

  1. counter += 1
  2. balance -= price
  3. greeting += ', привет!'

Работают с числами и строками (для строк += — приклеивание), в любом месте блока.

Переносы строк и JSON без кавычек

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

Теперь вызов функции можно переносить — просто разрывайте строку после запятой между аргументами:

Словари и массивы пишутся без обёртки в кавычки и на сколько угодно строк:

cfg = {
    "greeting": "Здравствуйте!",
    "work_hours": [10, 19]
}
hello = cfg["greeting"]

Единственное ограничение: внутри текста в кавычках ('...') разрывать строку нельзя. Переносите после запятой между аргументами или внутри {фигурных} и [квадратных] скобок — там можно разрывать где угодно.

Проверка ИИ

Любые строки калькулятора можно проверить с помощью ИИ, который подскажет все проблемы и ошибки при использовании методов, функций, операторов и циклов.