Fix argument insertion
This commit is contained in:
@@ -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)}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user