Блоки
Блоки представляют собой прогоны команд, заключённые в фигурные скобки. Как и переменные, командные блоки можно использовать вместо обычных аргументов команды. Например, эта команда:
i 2 * { i 3 + 4 }
фактически эквивалентна
i 2 * 7
Это довольно полезно для переопределения обычного порядка операций или для объединения команд, когда вывод одной является информацией, которую нужно указать как аргумент, а не как конвейерный ввод. Обратите внимание, что команда explain в настоящее время не поясняет содержимое командных блоков, а просто трактует их так, как если бы они были указаны обычными аргументами.
Некоторые команды явно требуют, чтобы блок был предоставлен в качестве аргумента, и не могут использовать обычные аргументы. Простейшим примером является команда map, которая просто многократно вычисляет блок для каждого входного значения:
> help map
map - Maps the input over the given block.
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 : IComomparable<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.