Цикл each
Для обхода массива, мапы и свойств объекта используется конструкция `each.
Обход массива
array1 = [1 2 3 4]
array2 = []
array1 `each index : value ~
array2.# = value * 2
;
array2 #echo s# -- выдаст: 2 4 6 8
Обход ассоциативного массива
prices = {%яблоко:10 %банан:8 %вишня:14} -- Цены (наименование : цена за кг)
cart = {%яблоко:2.0 %вишня:1.5} -- Покупки (наименование : вес в кг)
total_price = 0.0
cart `each key : weight ~
total_price += prices[key] * weight
;
['Цена всей покупки: ', total_price] #echo #
Смотри также: Ключевые слова: break, next
Обход объекта класса
$point3 ~
x y z
;
-- Масштабирование
&scale $point3: o factor ~
-- обход по ссылке
o `each property_name : value& ~
value *= factor
;
ret = o
;
`plain
[10 10 20] #as $point3 => position &scale 2
#echo [', ' ":"] -- выдаст 'x:20, y:20, z:40'
Смотри также: Классы и объекты
Отделение первого шага цикла
Тело цикла можно разделить символом \ на две части. Тогда первая часть будет выполняться только на первом шаге цикла, а вторая часть – на всех последующих шагах.
{%Ольга:22, %Николай:21, %Сергей:20} `each name : age ~
"\(name), \(age)" #echo #
\
"\n" #echo #
"\(name), \(age)" #echo #
;
В циклах `for и `while тоже доступна такая конструкция.
Задание последовательности обхода
Есть возможность обходить элементы в обратном порядке. Для этого перед переменной элемента ставится знак -.
[1 2 3] `each index : -item ~
item #echo # ;
-- выдаст: 321
Чтобы обходить элементы мапы или свойства объекта класса в порядке отсортированных ключей перед переменной ключа ставится знак +, а в обратном порядке ключей знак -.
{1:%One, 3:%Three, 2:%Two} => array
array `each +key : value ~
key #echo # ;
-- Выдаст: 123
n# #echo # -- Перевод строки
array `each -key : value ~
key #echo # ;
-- Выдаст: 321