phase: 20.49 COMPLETE; 20.50 Flow+String minimal reps; 20.51 selfhost v0/v1 minimal (Option A/B); hv1-inline binop/unop/copy; docs + run_all + CURRENT_TASK -> 21.0
This commit is contained in:
46
apps/macros/examples/array_prepend_zero_macro.hako
Normal file
46
apps/macros/examples/array_prepend_zero_macro.hako
Normal file
@ -0,0 +1,46 @@
|
||||
// array_prepend_zero_macro.hako
|
||||
// MacroBoxSpec.expand: prepend 0 to every Array elements list in AST JSON v0
|
||||
// Contract: expand(json: string) -> string (AST JSON v0)
|
||||
|
||||
static box MacroBoxSpec {
|
||||
expand(json) {
|
||||
local s, out, i, pat, plen, ins
|
||||
s = json
|
||||
out = ""
|
||||
i = 0
|
||||
pat = "\"kind\":\"Array\",\"elements\":["
|
||||
plen = pat.length()
|
||||
ins = "{\"kind\":\"Literal\",\"value\":{\"type\":\"int\",\"value\":0}}"
|
||||
|
||||
loop(i < s.length()) {
|
||||
if i + plen <= s.length() && s.substring(i, i + plen) == pat {
|
||||
// Copy the Array header
|
||||
out = out + pat
|
||||
// Look ahead: if next is ']' it's empty array; otherwise add comma after inserted element
|
||||
if i + plen < s.length() && s.substring(i + plen, i + plen + 1) != "]" {
|
||||
out = out + ins + ","
|
||||
} else {
|
||||
out = out + ins
|
||||
}
|
||||
i = i + plen
|
||||
continue
|
||||
}
|
||||
// Also support reversed key order: ..."elements":[ ... ],"kind":"Array"
|
||||
if i + 12 <= s.length() && s.substring(i, i + 12) == "\"elements\":[" {
|
||||
// We will inject blindly here assuming this 'elements' belongs to Array (per schema it does)
|
||||
out = out + "\"elements\":["
|
||||
if i + 12 < s.length() && s.substring(i + 12, i + 13) != "]" {
|
||||
out = out + ins + ","
|
||||
} else {
|
||||
out = out + ins
|
||||
}
|
||||
i = i + 12
|
||||
continue
|
||||
}
|
||||
// Copy-through
|
||||
out = out + s.substring(i, i + 1)
|
||||
i = i + 1
|
||||
}
|
||||
return out
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user