Tzopilotl
Docs
GitHub

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;
}