Iterators and Generic For
Nested Iteration
Nested loops let one iteration pattern run inside another.
nested loops
The inner loop completes for each outer loop value before the outer loop advances.
Nested Iteration
nested_iteration.lua
Replay: real traced execution (multi-file project)
local innerLimit = 2
local visits = 0
local lastLabel = ""
for outer = 1, 2 do
for inner = 1, innerLimit do
visits = visits + 1
lastLabel = outer .. ":" .. inner
end
end
print("innerLimit=" .. innerLimit)
print("visits=" .. visits)
print("lastLabel=" .. lastLabel)
local innerLimit = 1
local visits = 0
local lastLabel = ""
for outer = 1, 2 do
for inner = 1, innerLimit do
visits = visits + 1
lastLabel = outer .. ":" .. inner
end
end
print("innerLimit=" .. innerLimit)
print("visits=" .. visits)
print("lastLabel=" .. lastLabel)
local innerLimit = 3
local visits = 0
local lastLabel = ""
for outer = 1, 2 do
for inner = 1, innerLimit do
visits = visits + 1
lastLabel = outer .. ":" .. inner
end
end
print("innerLimit=" .. innerLimit)
print("visits=" .. visits)
print("lastLabel=" .. lastLabel)
innerLimit ← 2, visits ← 0, lastLabel ← (empty)
1local innerLimit→ 2 = 2 --@innerLimit=1, 32local visits→ 0 = 03local lastLabel→ (empty) = ""outer = 1, 2 do
pass 1 of 25for outer1 = 1, 2 do6 for inner = 1, innerLimit do7 visits = visits + 1visits ← 1, lastLabel ← 1:1
pass 1 of 45for outer = 1, 2 do6 for inner1 = 1, innerLimit2 do7 visits→ 1 = visits + 18 lastLabel→ 1:1 = outer1 .. ":" .. inner19 endAll 4 passes — pass 1 is the card above pass inneroutervisitslastLabel1 1 1 0 → 1 1:1 2 2 1 1 → 2 1:2 3 1 2 2 → 3 2:1 4 2 2 3 → 4 2:2 outer = 1, 2 do
pass 2 of 25for outer2 = 1, 2 do6 for inner = 1, innerLimit do7 visits = visits + 1print("innerLimit=" .. innerLimit)
12print("innerLimit=" .. innerLimit2)13print("visits=" .. visits4)14print("lastLabel=" .. lastLabel2:2)outputinnerLimit=2 visits=4 lastLabel=2:2
innerLimit ← 1, visits ← 0, lastLabel ← (empty)
1local innerLimit→ 1 = 12local visits→ 0 = 03local lastLabel→ (empty) = ""outer = 1, 2 do
pass 1 of 25for outer1 = 1, 2 do6 for inner = 1, innerLimit do7 visits = visits + 1visits ← 1, lastLabel ← 1:1
pass 1 of 25for outer = 1, 2 do6 for inner1 = 1, innerLimit1 do7 visits→ 1 = visits + 18 lastLabel→ 1:1 = outer1 .. ":" .. inner19 endouter = 1, 2 do
pass 2 of 25for outer2 = 1, 2 do6 for inner = 1, innerLimit do7 visits = visits + 1visits ← 2, lastLabel ← 2:1
pass 2 of 25for outer = 1, 2 do6 for inner1 = 1, innerLimit1 do7 visits→ 2 = visits + 18 lastLabel→ 2:1 = outer2 .. ":" .. inner19 endprint("innerLimit=" .. innerLimit)
12print("innerLimit=" .. innerLimit1)13print("visits=" .. visits2)14print("lastLabel=" .. lastLabel2:1)outputinnerLimit=1 visits=2 lastLabel=2:1
innerLimit ← 3, visits ← 0, lastLabel ← (empty)
1local innerLimit→ 3 = 32local visits→ 0 = 03local lastLabel→ (empty) = ""outer = 1, 2 do
pass 1 of 25for outer1 = 1, 2 do6 for inner = 1, innerLimit do7 visits = visits + 1visits ← 1, lastLabel ← 1:1
pass 1 of 65for outer = 1, 2 do6 for inner1 = 1, innerLimit3 do7 visits→ 1 = visits + 18 lastLabel→ 1:1 = outer1 .. ":" .. inner19 endAll 6 passes — pass 1 is the card above pass inneroutervisitslastLabel1 1 1 0 → 1 1:1 2 2 1 1 → 2 1:2 3 3 1 2 → 3 1:3 4 1 2 3 → 4 2:1 5 2 2 4 → 5 2:2 6 3 2 5 → 6 2:3 outer = 1, 2 do
pass 2 of 25for outer2 = 1, 2 do6 for inner = 1, innerLimit do7 visits = visits + 1print("innerLimit=" .. innerLimit)
12print("innerLimit=" .. innerLimit3)13print("visits=" .. visits6)14print("lastLabel=" .. lastLabel2:3)outputinnerLimit=3 visits=6 lastLabel=2:3