---
id: kw-for
name: for … in
category: control
kind: keyword
tokens: for
sig: for name in a .. b { … }
tip: Range loop — iterate the half-open range from a up to but not including b.
order: 2
---
The numeric for … in loop walks the half-open range `a .. b`, running the body for each value from `a` up to but not including `b`. Each pass binds a fresh, immutable name — it is not a reusable variable and cannot be reassigned inside the body — which makes the loop easy to reason about. Both bounds are ordinary expressions, so ranges built from constants like `0 .. GRID_WIDTH` read cleanly. The same `for … in` keyword also drives ECS query loops (`for (…) in query […]`); this page is the numeric range form. Use `break` and `continue` to exit early or skip to the next value.
```ludic
program Grid {
const GRID_WIDTH: int = 20
const GRID_HEIGHT: int = 15
const TILE_SIZE: int = 16
handler DrawWorld phase Render {
Screen.clear(Color.MidnightBlue)
for row in 0 .. GRID_HEIGHT {
for column in 0 .. GRID_WIDTH {
var tile_color = Color.MidnightBlue
if (column + row) % 2 == 0 { tile_color = Color.White }
Screen.fill_rectangle(x: column * TILE_SIZE, y: row * TILE_SIZE, width: TILE_SIZE, height: TILE_SIZE, color: tile_color)
}
}
Screen.show()
}
}
```