> ## Documentation Index
> Fetch the complete documentation index at: https://docs.ss14.art/llms.txt
> Use this file to discover all available pages before exploring further.

# Блоки

Блоки — это **выполнения команд**, обёрнутые в фигурные скобки. Как и переменные, блоки команд можно использовать вместо обычных аргументов команды. Например, эта команда:

```
i 2 * { i 3 + 4 }
```

фактически эквивалентна

```
i 2 * 7
```

Это полезно для переопределения обычного порядка операций или для объединения команд, когда вывод одной команды должен быть передан как аргумент, а не через pipe. Обратите внимание: команда `explain` в настоящее время не объясняет содержимое блоков команд — она обрабатывает их как обычные аргументы.

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

```
> help map

map - Применяет блок к каждому элементу входа.
Usage:
  <value (IEnumerable<TIn>)> → map <block (Block<TIn,TOut>)> → IEnumerable<TOut>
```

Эта команда особенно полезна, если другая команда принимает только один `TIn` и не поддерживает `IEnumerable<TIn>`. Например, эта команда удваивает, а затем увеличивает все значения в последовательности, используя командный блок, принимающий только одно целое число за раз:

```
> i 1 to 4 map { * 2 + 1 }

3,
5,
7,
9
```

Обратите внимание, что это всего лишь пример, так как на самом деле существуют специальные математические команды для умножения или сложения отдельных чисел с последовательностью (`i 1 to 4 */ 2 +/ 1`).

В качестве другого примера, команда `sortby` требует блок, который принимает тип `T` и возвращает другой тип, сравнимый с самим собой (`TOrd : IComparable<TOrd>`). Это можно использовать для сортировки сущностей по количеству их компонентов:

```
entities with MobState sortby { allcomps count }
```

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

```
entities with MobState tp:to { entities with MobState sortby { allcomps count } first }
```

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

```
entities with MobState => $mobs
var $mobs sortby { allcomps count } first => $destination
var $mobs tp:to $destination
```

Некоторые команды, требующие блоков, могут также определять локальные переменные блока, то есть переменные, которые существуют только внутри блока и часто доступны только для чтения. Пример см. в [команде Emplace](./commands/emplace).
