ksi

Язык программирования

Циклы

Цикл .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 ) )

Возможный результат:

Кидаем кубики: На первом кубике выпало чётное значение.

Читать далее: функция-генератор ›

Top