code wiki / _hdl_build / nx_fwdcall_probe.nx
nx_fwdcall_probe.nx source
↩ module page · 24 lines · 1055 B
1// nx_fwdcall_probe.nx -- DIAGNOSTIC: does nx_cc support FORWARD calls / mutual recursion (needed for a
2// recursive-descent formula parser: factor -> expr for parens)? Prints A/B chain result; expect 10.
3// license_tier: ORIGINAL
4import "nx_syscalls.nx"
5
6func fp_puts(s: *u8) -> i64 { var n: i64=0; while s[n]!=(0 as u8){n=n+1} sys_write(1,s,n); return 0 }
7func fp_num(v: i64) -> i64 { let b: *u8=sys_mmap(28); var m: i64=v; let t: *u8=sys_mmap(28); var k: i64=0; if m==0{t[0]=48 as u8;k=1} while m>0{t[k]=(48+(m%10)) as u8;m=m/10;k=k+1} var i: i64=0; while i<k{b[i]=t[k-1-i];i=i+1} sys_write(1,b,k); return 0 }
8
9// fp_a calls fp_b which is defined LATER (forward call), and fp_b recurses back into fp_a (mutual).
10func fp_a(n: i64) -> i64 {
11 if n <= 0 { return 0 }
12 return 1 + fp_b(n - 1)
13}
14func fp_b(n: i64) -> i64 {
15 if n <= 0 { return 0 }
16 return 1 + fp_a(n - 1)
17}
18
19func main() -> i64 {
20 let r: i64 = fp_a(10)
21 fp_puts("fwdcall result=" as *u8); fp_num(r); fp_puts(" (expect 10)\n" as *u8)
22 if r == 10 { return 0 }
23 return 1
24}