@for
Repeats its body. The implicit attribute n is a non-negative count (:3), an inclusive range (:0..6) that iterates upward, or a tabular dataset (:#islands), which iterates its rows top to bottom. Inside the body {{i}} splices the counter — the 1-based row number over a dataset — and over a dataset {{i.<column>}} splices that row's cell; as: renames both halves. Ranges must ascend — a descending from..to is a compile error.
#Attributes
nHow many times, or over what: a non-negative integer count (
:3), an inclusive from..to range (:0..6) that iterates upward, or a tabular dataset by reference (:#islands, :#statistics.faithful for a pack's), whose rows it walks in order. The dataset must be declared ABOVE the loop, and naming a column (#islands.area) is a compile error — loop over the dataset and write {{i.area}}. A geo dataset has no rows, and an attached file this build cannot read is refused rather than run zero times.number | interval | referenceCan be written as shorthand:
:valueasNames the binding —
as: k makes the splice {{k}} instead of {{i}} — which is how nested loops tell theirs apart. Over a dataset it renames both halves: {{row}} and {{row.area}}. Must be a valid identifier.#Allowed content
Body { }The content to repeat — spliced once per iteration with {{i}} (and, over a dataset, {{i.column}}) substituted
#Examples
@for:0..4{
point(x: {{i}}; y: {{i}})
}@for(n: 1..3; as: k){
Attempt {{k}} of 3.
}@data#islands{
island | area
Baltra | 25.09
Bartolome | 1.24
}
@for:#islands{
{{i}}. {{i.island}} covers {{i.area}} km$^2$.
}@for(n: #soil; as: row){
line#trace-{{row}}(x: 1, 2, 3; y: {{row.a}}, {{row.b}}, {{row.c}})
}