Tzopilotl
Docs
GitHub

Tzopilotl by Example

8. Pattern Matching and Destructuring

8.1 Patterns in Match

-- Literal patterns
match (n) {
    0: "zero" println;
    1: "one" println;
    _: "other" println;   -- wildcard
}

-- Binding patterns
match (x) {
    n: n println;        -- binds the value to n
}

-- Tuple patterns
let tup = (3, 4);
match (tup) {
    (x, y): println(x + y);
}

-- Struct patterns
match (point) {
    Point { x: a, y: b }: println(a + b);
}

-- Tuple struct patterns
match (p) {
    Point(x, y): println(x + y);
}

-- Enum patterns (Option<T> is a built-in enum)
let opt = Option.some(42);
match (opt) {
    Option.some(v): v println;
    Option.none: "nothing" println;
}

-- Array patterns
match (arr) {
    [1, 2, 3]: "exact match" println;
    [head, ...tail]: head println;
    _: "no match" println;
}

-- Boolean patterns
match (flag) {
    true: "yes" println;
    false: "no" println;
}

8.2 Destructuring in Declarations

-- Tuple destructuring
let (x, y) = (1, 2);
let (a, b, c) = (10, 20, 30);

-- Struct destructuring
let Point { x: px, y: py } = Point { x: 3, y: 4 };

-- Array destructuring
let [d, e, f] = [100, 200, 300];

-- Array head/rest
let [head, ...tail] = [1, 2, 3, 4];
head println;     -- 1
tail println;     -- [2, 3, 4]

-- Discard rest
let [first, ...] = [10, 20, 30];

-- Tuple head/rest
let (t1, t2, ...trest) = (10, 20, 30, 40, 50);
trest println;    -- (30, 40, 50)

-- Rest can capture any number of remaining elements (including 0 or 1)
let (a, ...r1) = (1, 2);
r1 println;       -- (2,)     -- 1-tuple

let (b, ...r0) = (1,);
r0 println;       -- ()       -- empty tuple

-- Tuple struct destructuring
struct Point(Float, Float);
let Point(x, y) = Point(3.0, 4.0);
x println;        -- 3.0
y println;        -- 4.0

-- Works with var and const too
var (mx, my) = (100, 200);
mx = 999;
const (cx, cy) = (42, 84);