Files
sx/examples/test_bus.sx
agra 6a920dbd2c ir
2026-02-28 18:03:38 +02:00

81 lines
2.3 KiB
Plaintext

#import "modules/std.sx";
main :: () {
n1 : s32 = 1;
n2 : s32 = 2;
n3 : s32 = 3;
f1 := closure((x: s32) -> s32 => x + n1);
f2 := closure((x: s32) -> s32 => x + n2);
f3 := closure((x: s32) -> s32 => x + n3);
print("f1: {}\n", f1(10));
print("f2: {}\n", f2(10));
print("f3: {}\n", f3(10));
// closure struct field
Button :: struct {
label: string;
on_press: Closure(s32) -> void;
}
btn_val := 99;
btn_cb := closure((id: s32) {
print("btn: {} {}\n", id, btn_val);
});
btn := Button.{ label = "OK", on_press = btn_cb };
btn.on_press(1);
// optional closure
f_none : ?Closure(s64) -> s64 = null;
if f_none != null { print("should not print\n"); }
else { print("opt-closure: none\n"); }
// closure factory
make_adder :: (n: s32) -> Closure(s32) -> s32 {
closure((x: s32) -> s32 => x + n);
}
add5 := make_adder(5);
add10 := make_adder(10);
print("factory: {} {}\n", add5(100), add10(100));
// HOF compose
compose :: (f: Closure(s32) -> s32, g: Closure(s32) -> s32) -> Closure(s32) -> s32 {
closure((x: s32) -> s32 => f(g(x)));
}
double :: (x: s32) -> s32 { return x * 2; }
cf := compose(add5, double);
print("compose: {}\n", cf(10));
// closure with array
sort_bubble :: (arr: [*]s32, cnt: s64, less: Closure(s32, s32) -> bool) {
i : s64 = 0;
while i < cnt {
j : s64 = 0;
while j < cnt - 1 {
if less(arr[j + 1], arr[j]) {
tmp := arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = tmp;
}
j += 1;
}
i += 1;
}
}
sort_arr : [5]s32 = .[5, 3, 1, 4, 2];
sort_bubble(xx @sort_arr, 5, closure((a: s32, b: s32) -> bool {
return a < b;
}));
print("sort: {} {} {} {} {}\n", sort_arr[0], sort_arr[1], sort_arr[2], sort_arr[3], sort_arr[4]);
// Many closures with string captures
tag1 := "hello";
tag2 := "world";
sf1 := closure((x: s32) { print("sf1: {} {}\n", tag1, x); });
sf2 := closure((x: s32) { print("sf2: {} {}\n", tag2, x); });
sf1(1);
sf2(2);
print("=== DONE ===\n");
}