code wiki / (root) / nx_fn_ptr_test.nx

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}