double := fun (n: int) -> int { return n * 2; }; assert double(2) == 4; assert double(18 + 3) == 42; assert double(double(-3)) == -12; fac := fun (n: int) -> int { if n == 0 { return 1; } return n * this(n - 1); }; assert fac(5) == 120; inner_val := fun () -> int { n := 28; return n; }; assert inner_val() == 28; inner_fun := fun (n: int) -> int { f := fun (n: int) -> int { return n * 2; }; return f(f(n)); }; assert inner_fun(4) == 16; twice := fun (n: int, f: (int -> int)) -> int { return f(f(n)); }; incr := fun (n: int) -> int { return n + 1; }; dble := fun (n: int) -> int { return n * 2; }; assert twice(4, incr) == 6; assert twice(4, dble) == 16; assert twice(3, fun (x: int) -> int { return x + 1; } ) == 5; fun sugar(n: int) -> int { return n * 2; } assert sugar(21) == 42; fun add3(x, y, z: int) -> int { return x + y + z; } assert add3(2, 4, 6) == 12; fun empty(n: string) { return; } empty('useless');