# Синтаксис языка

## Основы

### Как устроен SQ

Когда, например, в тексте сообщения попадается выражение в двойных фигурных скобках {{}}, бот вычисляет выражение внутри скобок и подставляет его значение в текст сообщения.

Например, значением выражения **2 \* 2** является число **4**, а значением выражения **"привет"** — строка **привет**.

### Примеры синтаксиса

{% hint style="info" %}
Символом **>>>** в примерах ниже отмечен ввод пользователя, а на строку ниже указан результат вычисления этого выражения.

Символом **#** отмечены комментарии (пояснения) к коду.
{% endhint %}

#### Арифметика

```
>>> 2 * 2
4

>>> 2 ** (4 + 10 / 5)
64
```

#### Переменные

Переменные позволяют хранить данные пользователей.

Переменные делятся на типы: числа, строки, массивы и словари.

От типа переменной зависит набор действий, который можно с ней выполнить. Например, числа можно сравнивать (>, <, >=, <=, ==, !=), делить и умножать. Строки, можно только складывать.

Имена переменных в боте (специальные, локальные и глобальные) начинаются и заканчиваются со знака процента, например, **%сообщение%**. С точки зрения SQ эти проценты -- часть имени переменной, а создавать новые временные переменные в самом SQ можно без значков процента, например, **x = 10**.

#### Операции сравнения

```
>>> x = 10
>>> x > 0
True

>>> x <= 0
False

>>> x == 10
True

>>> x += 2
>>> x
12

>>> x *= 2
>>> x
24

>>> y = 0
>>> x == 0 and y > 0 or x != 0 and y < 0
False

>>> not (x == 0 and y > 0 or x != 0 and y < 0)
True

# допустим, что %пол% равен "женский"
>>> 'да' if %пол% == 'женский' else 'нет'
'да'

# допустим, что %сообщение% равно "привет мир"
>>> 'прив' in %сообщение%
True

>>> ' ' in %сообщение%
True

>>> 'пока' not in %сообщение%
True
```

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

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

В SQ существует 3 варианта вызова функций: через точку, через пайп (|) и явно -- они взаимозаменяемые и равноценные.

```
'привет' | len
6

>>> len('привет')
6

>>> 'привет'.len()
6
```

**Пара примеров:**

```
# предположим, %сообщение% равно "привет мир"
>>> %сообщение%.startswith('привет')
True

>>> %сообщение%.endswith('привет')
False

>>> %сообщение%.endswith('мир')
True

>>> round(0.23)
0

>>> round(0.23, 1)
0.2

>>> 12345678 | pretty
12 345 678

# примечание: \ служит для экранирования кавычки в строке
>>> 12345678 | pretty('\'')
12'345'678

>>> rand([1, 2, 3])
1
```

#### Работа с массивами

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

```
>>> корзина = []
>>> корзина.push('хлеб')
>>> корзина.push('греча')
>>> корзина
['хлеб', 'греча']

>>> 'хлеб' in корзина
True

>>> 'сыр' in корзина
False

>>> корзина | pretty('\n')
хлеб
греча
```

#### Словари

Словарь похож на массив, но он позволяет запоминать сопоставление одного элемента — другому. Например, количество товара в корзине.

```
>>> корзина = {}
>>> корзина['хлеб'] = 3
>>> корзина['греча'] = 10
>>> корзина
{'хлеб': 3, 'греча': 10}

>>> 'хлеб' in корзина
True

>>> 'сыр' in корзина
False

>>> корзина | pretty
хлеб: 3
греча: 10
```

## Функциональное программирование

{% hint style="info" %}
Это сложный для понимания раздел, если вы не были ранее знакомы с программированием. Вполне возможно, что вы можете пропустить этот раздел)
{% endhint %}

### Лямбды (лямбда-выражения)

Лямбда (lambda) — анонимная функция.

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

#### Синтаксис

Давайте для примера рассмотрим функцию, которая принимает 3 аргумента: a, b, c и возвращает их сумму:

```
a, b, c => a + b + c
```

Таким образом, лямбда-выражение состоит их 2 частей: списка аргументов (до стрелки) и выражения (после стрелки). Результат выражения вернётся при вызове этой функции.

#### Пример

```
>>> корзина = {}
>>> корзина['хлеб'] = 3
>>> корзина['греча'] = 10

# выведем словарь в нужном нам формате
>>> корзина | map((k, v) => k + ' - ' + v + ' кг') | join
хлеб - 3 кг
греча - 10 кг
```

Тут мы использовали функцию **map()**, в которую передали в качестве аргумента нашу лямбду. Функция **map()** пройдёт по всем парам ключ-значение (**k, v**) в словаре **корзина** и вместо него вернёт строку — результат сложения **k**, дефиса, **v** и слова **"кг"**.


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.smartbotpro.ru/smartquery/sintaksis-yazyka.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
