code wiki / _hdl_build / nx_wflow_loop_gate.nx
nx_wflow_loop_gate.nx source
↩ module page · 114 lines · 5080 B
1// nx_wflow_loop_gate.nx -- R11 LOOPS gate: for-each = apply-to-each over the connector plane. Step arg
2// `<listexpr>~<template>`: the list substitutes ONCE (comma-split, 32-cap loud), then per item the engine
3// binds {item} as a run variable, emits WFITER, substitutes the template, forks the connector. Any failed
4// item fails the STEP (retry/on-fail machinery applies). Empty list = zero iterations, step OK. Proves the
5// per-item argv actually varies (argecho), the last item persists as {item} for later steps, empty-list
6// no-op, item failure fail-stops, load refusals. THREE forks. license_tier: ORIGINAL expect_exit: 0
7import "nx_wflow_engine.nx"
8
9func lg_n(led: *u8, ridtok: *u8, st: *u8) -> i64 {
10 let szp: *i64 = sys_mmap(8) as *i64
11 let b: *u8 = wf_readall(led, szp)
12 if (b as i64) == 0 { return 0 - 1 }
13 return wf_lines_with2(b, szp[0], ridtok, st)
14}
15func lg_row(conf: *u8, name: *u8, elf: *u8, flag: *u8) -> i64 {
16 let ln: *u8 = sys_mmap(600)
17 var o: i64 = 0
18 o = wf_cat(ln, o, name)
19 ln[o] = 9 as u8
20 o = o + 1
21 o = wf_cat(ln, o, elf)
22 ln[o] = 9 as u8
23 o = o + 1
24 o = wf_cat(ln, o, flag)
25 ln[o] = 10 as u8
26 ln[o+1] = 0 as u8
27 return wf_append(conf, ln)
28}
29
30func main() -> i64 {
31 p("=== NX-WFLOW-LOOP GATE (R11: for-each over the connector plane; WFITER records; item var) ===\n" as *u8)
32 var ok: i64 = 1
33 let now: i64 = wf_now()
34 let led: *u8 = sys_mmap(128)
35 var lo: i64 = 0
36 lo = wf_cat(led, lo, "/tmp/wflp_" as *u8)
37 lo = wf_catn(led, lo, now)
38 lo = wf_cat(led, lo, ".log" as *u8)
39 led[lo] = 0 as u8
40 let conf: *u8 = sys_mmap(128)
41 var co: i64 = 0
42 co = wf_cat(conf, co, "/tmp/wflp_" as *u8)
43 co = wf_catn(conf, co, now)
44 co = wf_cat(conf, co, ".conf" as *u8)
45 conf[co] = 0 as u8
46 lg_row(conf, "argecho" as *u8, "./_offc/nx_tool_argecho.elf" as *u8, "GREEN" as *u8)
47 lg_row(conf, "ghost" as *u8, "/tmp/wflow_no_such_elf_ever" as *u8, "GREEN" as *u8)
48
49 let flows: *i64 = sys_mmap(8 * 4) as *i64
50 flows[0] = "fm1|invite|-" as *u8 as i64
51 flows[1] = "fm2|empty|-" as *u8 as i64
52 flows[2] = "fm3|boom|-" as *u8 as i64
53 let steps: *i64 = sys_mmap(8 * 8) as *i64
54 steps[0] = "fm1|1|for-each|argecho|{guests}~greet~{item}|1" as *u8 as i64
55 steps[1] = "fm1|2|notify|-|Last invited was {item}|1" as *u8 as i64
56 steps[2] = "fm2|1|for-each|argecho|{none}~x|1" as *u8 as i64
57 steps[3] = "fm3|1|for-each|ghost|{guests}~x|1" as *u8 as i64
58 let cx: *i64 = sys_mmap(32) as *i64
59 cx[0] = steps as i64
60 cx[1] = 4
61 cx[2] = led as i64
62 cx[3] = conf as i64
63
64 // T0 load: rows valid; missing connector or empty arg refused
65 let l0: i64 = wf_load(steps, 4)
66 let bad1: *i64 = sys_mmap(16) as *i64
67 bad1[0] = "f9|1|for-each|-|x|1" as *u8 as i64
68 let lb1: i64 = wf_load(bad1, 1)
69 let bad2: *i64 = sys_mmap(16) as *i64
70 bad2[0] = "f9|1|for-each|argecho||1" as *u8 as i64
71 let lb2: i64 = wf_load(bad2, 1)
72 p(" T0 load=" as *u8); pn(l0); p(" noConn=" as *u8); pn(lb1); p(" noArg=" as *u8); pn(lb2); p("\n" as *u8)
73 if l0 != 4 { ok = 0 }
74 if lb1 != (0 - 1) { ok = 0 }
75 if lb2 != (0 - 1) { ok = 0 }
76
77 // T1 two-item loop: WFITER x2, per-item argv varied, {item} persists into the NEXT step (last item)
78 wf_fire(cx, flows, 3, "invite~guests=Rose,Ann~id=L1" as *u8)
79 let d1: i64 = lg_n(led, " rid=L1.fm1 " as *u8, "status=DONE" as *u8)
80 let it: i64 = lg_n(led, " rid=L1.fm1 " as *u8, "WFITER" as *u8)
81 let lastv: i64 = lg_n(led, " rid=L1.fm1 " as *u8, "k=item v=Ann" as *u8)
82 let s2: i64 = lg_n(led, " rid=L1.fm1 " as *u8, " step=2 status=OK" as *u8)
83 p(" T1 loop done=" as *u8); pn(d1); p(" iters=" as *u8); pn(it); p(" lastItemAnn=" as *u8); pn(lastv); p(" nextStep=" as *u8); pn(s2); p("\n" as *u8)
84 if d1 != 1 { ok = 0 }
85 if it != 2 { ok = 0 }
86 if lastv != 1 { ok = 0 }
87 if s2 != 1 { ok = 0 }
88
89 // T2 empty list (var exists, empty value) = zero iterations, step OK, run DONE
90 wf_fire(cx, flows, 3, "empty~none=~id=L2" as *u8)
91 let d2: i64 = lg_n(led, " rid=L2.fm2 " as *u8, "status=DONE" as *u8)
92 let it2: i64 = lg_n(led, " rid=L2.fm2 " as *u8, "WFITER" as *u8)
93 p(" T2 empty done=" as *u8); pn(d2); p(" iters=" as *u8); pn(it2); p("\n" as *u8)
94 if d2 != 1 { ok = 0 }
95 if it2 != 0 { ok = 0 }
96
97 // T3 item failure (dead elf) -> step FAILED, run FAILED
98 wf_fire(cx, flows, 3, "boom~guests=Solo~id=L3" as *u8)
99 let f3: i64 = lg_n(led, " rid=L3.fm3 " as *u8, "status=FAILED" as *u8)
100 let d3: i64 = lg_n(led, " rid=L3.fm3 " as *u8, "status=DONE" as *u8)
101 p(" T3 boom failed=" as *u8); pn(f3); p(" done=" as *u8); pn(d3); p("\n" as *u8)
102 if f3 != 1 { ok = 0 }
103 if d3 != 0 { ok = 0 }
104
105 // T4 negctl
106 let ban: i64 = lg_n(led, "WFITER" as *u8, "item=BANANA" as *u8)
107 p(" T4 negctl nonsense=" as *u8); pn(ban); p("\n" as *u8)
108 if ban != 0 { ok = 0 }
109
110 p("NX-WFLOW-LOOP-GATE ledger=" as *u8); p(led); p(" forks=3 " as *u8)
111 if ok == 1 { p("verdict=GREEN\n" as *u8); return 0 }
112 p("verdict=RED\n" as *u8)
113 return 1
114}