Сделать поддержку for не так уж и просто.
У меня это:
for a in iterable {

};
как в питоне, только a является по сути каждым элементом iterable, то есть значение iterable изменится, в отличие от питона. Чтобы реализовать фор, надо потрудиться с адресами, у, ужас. Добавить новые значения в структуру с локальными переменными, мол приравнивание надо делать по указателю.
Получится, если %a := address iterable[index], то когда a := n, надо %a-> := %n, как-то так. Думаю синтаксис *%a := %n лучшу, похоже на сишный. А адреса будут расчитываться в каждой отдельной инструкции. То есть, если есть a->->-> (то куда ссылается куда ссылается куда ссылается a) станет %0 := *%a; %1 := *%0; %2 := *%1
У меня переменные байткода не как в LLVM. В LLVM там адреса и к ним приравниваются значения, а чтение через инструкцию load, а у меня чтение и присваивание происходит с одними и теми же переменными.

Но я реализовал lenof и индексацию:

u8 @0 'a' := 0x21

func(u8,[u32 %0,f32e8 %1]) @1 'main' := {
.0:
        %2 := alloca u8[6];
        %3 := lenof %2;
        %2[0x2] := %3;
        %4 := @0 + 0x39;
        return %4;
}

Я видел одного анона, который жаловался, что в питоне for не как в си и считал это идиотизмом. Дурак, для него же как лучше сделали! Вот в момё ЯП у циклов есть postins, это то, что выполняется после каждой итерации, в т. ч. и continue. Благодаря этому сишный for (int i := 0; i < n; i++) {ins} у меня будет s32 i := 0; while (i < n): i++ {ins};