nx_fn_ptr_test.nx source
↩ module page · 64 lines · 2216 B
1// nx_fn_ptr_test.nx -- exercise first-class function pointers.
2
3import "nx_kernel_v2.nx"
4
5func add(a: nx_int, b: nx_int) -> nx_int { return a + b }
6func sub(a: nx_int, b: nx_int) -> nx_int { return a - b }
7func mul(a: nx_int, b: nx_int) -> nx_int { return a * b }
8func neg_x(a: nx_int, b: nx_int) -> nx_int { return -a }
9
10// ===== T1: assign function to fn-ptr local, call indirectly =====
11func t1_basic_indirect() -> nx_int {
12 let op: func(nx_int, nx_int) -> nx_int = add
13 let r: nx_int = op(3, 4)
14 if r != 7 { return 1 }
15 return 0
16}
17
18// ===== T2: reassign fn-ptr to a different function =====
19func t2_reassign() -> nx_int {
20 var op: func(nx_int, nx_int) -> nx_int = add
21 let r1: nx_int = op(10, 2)
22 if r1 != 12 { return 2 }
23 op = sub
24 let r2: nx_int = op(10, 2)
25 if r2 != 8 { return 2 }
26 op = mul
27 let r3: nx_int = op(10, 2)
28 if r3 != 20 { return 2 }
29 return 0
30}
31
32// ===== T3: fn-ptr passed to a higher-order function =====
33// `apply` takes a fn-ptr param and two ints; calls the fn.
34func apply_op(op: func(nx_int, nx_int) -> nx_int, a: nx_int, b: nx_int) -> nx_int {
35 return op(a, b)
36}
37
38func t3_higher_order() -> nx_int {
39 if apply_op(add, 5, 3) != 8 { return 3 }
40 if apply_op(sub, 5, 3) != 2 { return 3 }
41 if apply_op(mul, 5, 3) != 15 { return 3 }
42 if apply_op(neg_x, 7, 99) != -7 { return 3 }
43 return 0
44}
45
46func main() -> nx_exit {
47 println("=== nx_fn_ptr -- first-class function pointers smoke ===" as *u8)
48
49 let r1: nx_int = t1_basic_indirect()
50 if r1 != 0 { println("T1 basic_indirect FAIL" as *u8); return r1 }
51 println("T1 basic_indirect PASS let op = add; op(3, 4) = 7 via jalr/call*reg" as *u8)
52
53 let r2: nx_int = t2_reassign()
54 if r2 != 0 { println("T2 reassign FAIL" as *u8); return r2 }
55 println("T2 reassign PASS var op = add/sub/mul reassigned + called" as *u8)
56
57 let r3: nx_int = t3_higher_order()
58 if r3 != 0 { println("T3 higher_order FAIL" as *u8); return r3 }
59 println("T3 higher_order PASS fn-ptr as parameter to apply_op() dispatches add/sub/mul/neg" as *u8)
60
61 println("" as *u8)
62 println("First-class function pointers: parse, IR, codegen end-to-end." as *u8)
63 return 0
64}