Fix argument insertion

This commit is contained in:
Jan-Niclas Loosen
2025-10-18 14:08:20 +02:00
parent 64061d8b79
commit 081a7132fc
3 changed files with 32 additions and 12 deletions

View File

@@ -26,17 +26,29 @@ class MaMaMa(MaMa):
# Flatten macros recursively
def __flatten_macro(self) -> None:
def expand(prog: Dict[int, str], stack: List[str]) -> List[Tuple[str, List[str]]]:
def expand(prog: Dict[int, str], stack: List[str], env: Dict[str, Any]) -> List[Tuple[str, List[str]]]:
out: List[Tuple[str, List[str]]] = []
for _, micro in sorted(prog.items()):
name, args = self.decode(micro)
# substitute arguments if defined in env
if args:
args = [env.get(str(a), a) for a in args]
micro = f"{name}({','.join(map(str, args))})"
if name in self.macros:
out.extend(expand(self.macros[name]["prog"], stack + [name]))
macro = self.macros[name]
params = macro.get("args") or []
new_env = env.copy()
if args and params:
for p, v in zip(params, args):
new_env[p] = v
out.extend(expand(macro["prog"], stack + [name], new_env))
else:
out.append((micro, list(stack)))
return out
expanded = expand(self.prog, [])
expanded = expand(self.prog, [], {})
self.prog = {i: call for i, (call, _) in enumerate(expanded)}
self._macro_trace = {i: macros for i, (_, macros) in enumerate(expanded)}