Simplify code generation for a top-level recursive function

This commit is contained in:
Emi Simpson 2024-03-17 10:35:55 -04:00
parent 23ef1f1228
commit 1d8fdb1a81
Signed by: Emi
GPG Key ID: A12F2C2FFDC3D847
1 changed files with 11 additions and 1 deletions

12
ir.py
View File

@ -38,8 +38,18 @@ class ReplHole:
return '[]'
def render(self) -> str:
def render_var(var_name: str, var_expr: Expression) -> str:
match var_expr:
case LetBinding(prev_func_name, MonoFunc(formal, func_body), Variable(mb_prev_func_name)):
if mb_prev_func_name == prev_func_name:
func_body_with_new_name = func_body.subst(Variable(var_name), prev_func_name)
return f'function {var_name}({formal}) {{return {func_body_with_new_name.codegen()}}}'
else:
raise Exception('This useless LetBinding should have been removed by the optimization stage')
case _:
return f'const {var_name} = ({var_expr.codegen()});'
return '\n'.join(
f'const {var_name} = ({var_expr.codegen()});'
render_var(var_name, var_expr)
for (var_name, var_expr) in self.val_bindings[::-1]
if var_name not in types_.BUILTINS_CONTEXT
)