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