The thing about FOR and FOREACH loops as i see it is there is more to remember and the interpreter doesnt really remember much, it just chugs along interpreting what ever it finds as it finds it. ill give you this as an example.
var %c = 1
var %i = 1
var %m = 500
while (%c < %m) {
echo -a %c
inc %c %i
dec %m %i
inc %i
}
results : 1 2 4 7 11 16 22 29 37 46 56 67 79 92 106 121 137 154 172 191 211 232
now a QBASIC for loop (sorry i didnt have anything else here)
i = 1
m = 500
for c = 1 to m step i
print c
m = m - i
i = i + 1
next
results : 1 2 3 4 5 .... 98 99 500
which is mirc ment to do, the "1 2 4 ..." or the "1 2 3 ..." if its the "1 2 3 ..." then mirc must store the original valuie of %m (max value) & %i (incrementor) which pretty much it just doesnt do, it comes back and interprets the line again to see if the condition valid or false, but with a FOR it would need to have stored the max value and the incrementor and uses them again.
The above fact that while loops run comparing a varable/modifable arguemnet for repititon on its own makes the while loop a superset command to for and foreach,
Anything a for or a foreach can do a while can do also, while a for or foreach cant reproduce what a while loop can (with out some tricky coding)