Язык программирования
Циклы
Цикл .each для массива
@main
numbers = [3 2 1] -- массив
.do (
numbers
reverse@std{}
.each .var item (
item.key write@std{}
':' write@std{}
item.val write_line@std{}
)
)
Результат:
0:1
1:2
2:3
В этом примере перемнной numbers присваивается массив (тип $array). Индексация массива начинается с нуля.
Слева от двоеточия тут выведен индекс, а затем значение.
reverse@std ~ Функция возвращает новый массив в обратном порядке от исходного массива.
В этом примере переменная item локальна внутри лишь цикла .each
reverse_it@std ~ Функция-модификатор, которая меняет исходную последовательность.
Цикл .each для диапазона
@main
range = $range(1 3)
.do (
.var (row cell)
-- Таблица умножения чисел от 1 до 3
range .for .each row (
range .for .each cell (
cell.val > row.val
.then ( .leave_scope )
.seq (" ", row.val * cell.val)
write@std{}
)
write_line@std()
)
)
Результат:
1
2 4
3 6 9
Определение переменных row и cell в этом примере вынесено за пределы обоих циклов.
У команды .for есть параметр шага.
.for(step: 0.5) или просто .for(0.5)
Внутри цкла доступна команда .leave_scope ~ выход из цикла.
С указанием глубины вложенности:
.leave_scope(depth: 2) или просто .leave_scope(2)
Условие .then .else, Цикл .loop
Напишем программу, которая в цикле генерирует по два случайных числа.
Условия выхода из цикла в этом примере: 6+6 или 1+1
@main
dice = $range(1 6)
.do (
"Кидаем кубики:" write_line@std{}
.loop (
.var (n1 n2) =: dice random@std{}
n1 == n2 == 6
.then (
'Выпало две шестёрки. Вам очень повезло!'
write_line@std{}
.leave_scope
)
.else (n1 == n2 == 1) .then
'Выпало две единички.' write_line@std{}
.leave_scope
)
.else (
"Выпало %{n1} и %{n2}" write_line@std{}
)
)
)
Возможный результат:
Кидаем кубики:
Выпало две единички.
Особый оператор присваивания =: выполняет действия из правой части отдельно для каждой ячейки из указанных слева в круглых скобках.
Выбор .switch
Напишем ещё одну программу, которая в цикле генерирует по два случайных числа.
Но здесь условия выхода обернём в .switch, и запишем следующим образом:
Первый кубик - чётное число;
На обоих кубиках единички.
@main
dice = $range(1 6)
.do (
"Кидаем кубики:" write_line@std{}
.loop (
.var (n1 n2) =: dice random@std{}
n1 .switch (
[2, 4, 6]: (
'На первом кубике выпало чётное число.'
write_line@std{}
.leave_scope
)
(n1 == n2 == 1): (
'Выпало две единички.' write_line@std{}
.leave_scope
)
.else: (
"Выпало %{n1} и %{n2}" write_line@std{}
)
) -- end switch
)
)
Возможный результат:
Кидаем кубики:
На первом кубике выпало чётное значение.
Читать далее: функция-генератор ›