Циклы while ... do и do ... while
do <expr> while <test_expr> --ФОРМА do
while <test_expr> do <expr> --ФОРМА while

Циклы while и do повторяют выполнение выражения <expr> до тех пор, пока тестовое выражение <test_expr> не возвратит ложь, т.е. пока оно истинно, они работают. Форма do выполняется минимум один раз, вычисляя тестовое выражение в конце каждого прохода. Форма while вычисляет тестовое выражение в начале каждого прохода и может не выполниться ни разу. Обе формы в качестве своего значения возвращают результат выражения <expr> после последнего удачного прохода. Форма while возвратит значение undefined, если тестовое выражение ложно изначально и ни одного прохода не выполнится.

Пример 1:
x = -10
while x < 0 do (print x; x += 1)

Пример 2:
do 
( 
exchanged = false 
for i=1 to imax do 
 (
 j=i+gap
 if (compare array[j] array[i]) do (swap array[j] array[i]; exchanged=true)
 )
) 
while exchanged 

Цикл for
for <var_name> (in | = ) <sequence> (do | collect) <expr>

Цикл for повторяет определенное число проходов, которое может задаваться диапазоном чисел, временным интервалом или последовательностью определенных величин, таких, как массив или набор выделенных объектов. Переменной с именем <var_name> последовательно присваиваются значения из набора <sequence>, формат которого бывает либо такой: <expr> [where <expr>],
либо такой: <expr> to <expr> [by <expr>] [where <expr>]

Примеры:
for i = 1 to 10 do print i --ПОСЛЕДОВАТЕЛЬНОСТЬ ЧИСЕЛ
for item in array1 do x = x + item.height --ПОСЛЕДОВАТЕЛЬНОСТЬ ЭЛЕМЕНТОВ МАССИВА
for t in 0f to 100f by 5f do ... --ВРЕМЕННОЙ ИНТЕРВАЛ (0–100) ЧЕРЕЗ КАЖДЫЕ 5 ФРЕЙМОВ

Следующий пример собирает объекты в массив bigones:
bigones = for obj in $box* --ДЛЯ ВСЕХ ОБЪЕКТОВ, ЧЬЕ ИМЯ НАЧИНАЕТСЯ С box
where obj.height > 100 collect obj --СОБИРАТЬ ОБЪЕКТЫ С ВЫСОТОЙ БОЛЬШЕ 100

Выражение <expr>, стоящее после ключевого слова where, вычисляется перед каждым проходом и должно возвращать либо true – тогда проход просчитывается, либо false – цикл игнорирует текущий проход и переходит к следующему.

Пропуск проходов и принудительный выход из циклов
Оператор continue осуществляет мгновенный переход в конец цикла и начинает следующий проход.
Примеры:
for i=1 to 8 do (if i == 5 do continue; print i) --ПЕЧАТАЕТ 1..4, 6..8
for i=1 to 8 collect (if i == 5 do continue; i) --ВОЗВРАЩАЕТ #(1, 2, 3, 4, 6, 7, 8)
while not eof do --ЧИТАЕТ ДАННЫЕ, ПОКА НЕ ДОЙДЕТ ДО КОНЦА ФАЙЛА
(
local line_f=readline f --СЧИТЫВАЕТ ОДНУ СТРОКУ
if line_f[1] == "-" do continue --ЕСЛИ КОММЕНТАРИЙ, ПЕРЕХОД НА СЛЕДУЮЩУЮ СТРОКУ
line1=parser1 line_f --ВЫЗОВ ФУНКЦИИ parser1
processobjs line1 --ВЫЗОВ ФУНКЦИИ processobjs
)

Оператор exit немедленно прекращает выполнение любого цикла, даже если тестовое выражение по-прежнему истинно. Он полезен при поиске ошибок в телах циклов: exit [with <expr>]
Пример:
while x < y do
(
local delta = x – y
if delta <= 0 then exit --УСЛОВИЕ ВЫХОДА
$foo.pos.x = compute_x (foo / delta)
x += 0.1
)

Необязательный параметр with позволяет задать выражение, которому будет равно общее значение цикла, если он завершится преждевременно. Если его не задать, цикл, из которого вышли оператором exit, возвратит значение undefined.

Выход из цикла for ... do с использованием параметра with <expr> возвращает значение OK.
Выход из цикла for ... collect с использованием параметра with <expr> возвращает массив величин, собранный на момент выхода.