Iterators and Generic For
Filter Loop
Combine ipairs with an if guard to keep selected values.
guarded iteration
A loop can visit every value while an `if` statement decides which values affect the accumulated result.
Filter Loop
filter_loop.lua
Replay: real traced execution (multi-file project)
local limit = 4
local kept = 0
local last = 0
for _, value in ipairs({2, 4, 6, 8}) do
if value >= limit then
kept = kept + 1
last = value
end
end
print("limit=" .. limit)
print("kept=" .. kept)
print("last=" .. last)
local limit = 3
local kept = 0
local last = 0
for _, value in ipairs({2, 4, 6, 8}) do
if value >= limit then
kept = kept + 1
last = value
end
end
print("limit=" .. limit)
print("kept=" .. kept)
print("last=" .. last)
local limit = 6
local kept = 0
local last = 0
for _, value in ipairs({2, 4, 6, 8}) do
if value >= limit then
kept = kept + 1
last = value
end
end
print("limit=" .. limit)
print("kept=" .. kept)
print("last=" .. last)
limit ← 4, kept ← 0, last ← 0
1local limit→ 4 = 4 --@limit=3, 62local kept→ 0 = 03local last→ 0 = 0_, value in ipairs({2, 4, 6, 8}) do
pass 1 of 45for _1, value2 in ipairs({2, 4, 6, 8}) do6 if value >= limit then7 kept = kept + 1All 4 passes — pass 1 is the card above pass _value1 1 2 2 2 4 3 3 6 4 4 8 kept ← 1, last ← 4
pass 1 of 35for _, value in ipairs({2, 4, 6, 8}) do6 if value4 >= limit4 then7 kept→ 1 = kept + 18 last→ 4 = value49 endAll 3 passes — pass 1 is the card above pass valuekeptlast1 4 0 → 1 4 2 6 1 → 2 6 3 8 2 → 3 8 print("limit=" .. limit)
12print("limit=" .. limit4)13print("kept=" .. kept3)14print("last=" .. last8)outputlimit=4 kept=3 last=8
limit ← 3, kept ← 0, last ← 0
1local limit→ 3 = 32local kept→ 0 = 03local last→ 0 = 0_, value in ipairs({2, 4, 6, 8}) do
pass 1 of 45for _1, value2 in ipairs({2, 4, 6, 8}) do6 if value >= limit then7 kept = kept + 1All 4 passes — pass 1 is the card above pass _value1 1 2 2 2 4 3 3 6 4 4 8 kept ← 1, last ← 4
pass 1 of 35for _, value in ipairs({2, 4, 6, 8}) do6 if value4 >= limit3 then7 kept→ 1 = kept + 18 last→ 4 = value49 endAll 3 passes — pass 1 is the card above pass valuekeptlast1 4 0 → 1 4 2 6 1 → 2 6 3 8 2 → 3 8 print("limit=" .. limit)
12print("limit=" .. limit3)13print("kept=" .. kept3)14print("last=" .. last8)outputlimit=3 kept=3 last=8
limit ← 6, kept ← 0, last ← 0
1local limit→ 6 = 62local kept→ 0 = 03local last→ 0 = 0_, value in ipairs({2, 4, 6, 8}) do
pass 1 of 45for _1, value2 in ipairs({2, 4, 6, 8}) do6 if value >= limit then7 kept = kept + 1All 4 passes — pass 1 is the card above pass _valuelimitkeptlast1 1 2 — — — 2 2 4 — — — 3 3 6 6 0 → 1 6 4 4 8 6 1 → 2 8 kept ← 1, last ← 6
pass 1 of 25for _, value in ipairs({2, 4, 6, 8}) do6 if value6 >= limit6 then7 kept→ 1 = kept + 18 last→ 6 = value69 endkept ← 2, last ← 8
pass 2 of 25for _, value in ipairs({2, 4, 6, 8}) do6 if value8 >= limit6 then7 kept→ 2 = kept + 18 last→ 8 = value89 endprint("limit=" .. limit)
12print("limit=" .. limit6)13print("kept=" .. kept2)14print("last=" .. last8)outputlimit=6 kept=2 last=8
Follow the Filter
limitstarts as4.- The loop visits
2,4,6, and8. - Values at least
4are kept. - The kept values are
4,6, and8. keptbecomes3andlastbecomes8. | value | kept at limit 4? | last after step | | --- | --- | --- | | 2 | no | 0 | | 4 | yes | 4 | | 6 | yes | 6 | | 8 | yes | 8 |
Exercise: filter_loop.lua
Reproduce limit=4, kept=3, and last=8, then use the pinned limit variants 3 and 6 to predict kept=3 last=8 and kept=2 last=8.