Tzopilotl by Example
5. Control Flow
5.1 If / Else
if (x > 0) {
"positive" println;
} else if (x < 0) {
"negative" println;
} else {
"zero" println;
}
-- If/else as expression (last value in each branch)
fn classify(n Int) String {
if (n < 0) {
"negative"
} else if (n == 0) {
"zero"
} else {
"positive"
}
}
5.2 Ternary Expression
fn abs(x Int) Int = x < 0 ? -x : x;
-- Ternaries can be chained
fn clamp(x Int, lo Int, hi Int) Int = x < lo ? lo : x > hi ? hi : x;
5.3 While Loops
var i = 0;
while (i < 10) {
i println;
i = i + 1;
}
5.4 Break and Continue
-- break exits the innermost loop immediately
var i = 0;
while (i < 100) {
if (i == 5) { break; }
i println;
i = i + 1;
}
-- Output: 0 1 2 3 4
-- continue skips to the next iteration
for (x : (1..6)) {
if (x == 3) { continue; }
x println;
}
-- Output: 1 2 4 5 6
-- break works with for loops over arrays, lists, and ranges
let arr = [10, 20, 30, 40];
for (x : arr) {
if (x == 30) { break; }
x println;
}
-- Output: 10 20
-- break is essential for infinite ranges
var sum = 0;
for (n : (1..)) {
if (n > 10) { break; }
sum = sum + n;
}
sum println; -- 55
-- In nested loops, break and continue affect only the innermost loop
for (i : (1..3)) {
for (j : (1..5)) {
if (j > 2) { break; }
println(i * 10 + j);
}
}
-- Output: 11 12 21 22 31 32
5.5 Match (Pattern Matching)
match (value) {
1: "one" println;
2: "two" println;
_: "other" println;
}
-- With guards
match (x) {
n if (n > 0): "positive" println;
n if (n < 0): "negative" println;
0: "zero" println;
}
-- Multi-statement match arms use blocks
match (shape) {
Shape.circle(r): {
"Circle" println;
r println;
}
Shape.unknown: "Unknown" println;
}