#include #include #include #include "datum.h" #include "env.h" #include "stack.h" int main() { datum *val, *argl, *proc; void *continu, *entry; environment *env = get_global_environment(); stack *proc_stack = create_stack(); stack *env_stack = create_stack(); stack *argl_stack = create_stack(); stack *continu_stack = create_stack(); val = make_compiled_proc(&&entry29, env); goto afterlambda28; entry29: env = proc->env; const char *argv30[] = {"n", }; env = extend_environment(argv30, argl, env); save(continu, continu_stack); save(env, env_stack); proc = lookup_variable_value("=", env); val = const_i32(1); argl = cons(val, NULL); val = lookup_variable_value("n", env); argl = cons(val, argl); if (primitive_procedure(proc) == 1) goto primitivebranch45; goto compiledbranch44; compiledbranch44: continu = &&aftercall43; entry = compiled_procedure_entry(proc); goto *entry; primitivebranch45: val = (*proc->primitive_procedure)(argl); aftercall43: env = restore(env_stack); continu = restore(continu_stack); if(is_false(val)) goto falsebranch32; goto truebranch33; truebranch33: val = const_i32(1); goto *continu; falsebranch32: proc = lookup_variable_value("*", env); save(continu, continu_stack); save(proc, proc_stack); save(env, env_stack); proc = lookup_variable_value("fac", env); save(proc, proc_stack); proc = lookup_variable_value("-", env); val = const_i32(1); argl = cons(val, NULL); val = lookup_variable_value("n", env); argl = cons(val, argl); if (primitive_procedure(proc) == 1) goto primitivebranch36; goto compiledbranch35; compiledbranch35: continu = &&aftercall34; entry = compiled_procedure_entry(proc); goto *entry; primitivebranch36: val = (*proc->primitive_procedure)(argl); aftercall34: argl = cons(val, NULL); proc = restore(proc_stack); if (primitive_procedure(proc) == 1) goto primitivebranch39; goto compiledbranch38; compiledbranch38: continu = &&aftercall37; entry = compiled_procedure_entry(proc); goto *entry; primitivebranch39: val = (*proc->primitive_procedure)(argl); aftercall37: argl = cons(val, NULL); env = restore(env_stack); val = lookup_variable_value("n", env); argl = cons(val, argl); proc = restore(proc_stack); continu = restore(continu_stack); if (primitive_procedure(proc) == 1) goto primitivebranch42; goto compiledbranch41; compiledbranch41: entry = compiled_procedure_entry(proc); goto *entry; primitivebranch42: val = (*proc->primitive_procedure)(argl); goto *continu; aftercall40: afterif31: afterlambda28: val = define_variable("fac", val, env); val = make_compiled_proc(&&entry5, env); goto afterlambda4; entry5: env = proc->env; const char *argv6[] = {"n", }; env = extend_environment(argv6, argl, env); save(continu, continu_stack); save(env, env_stack); proc = lookup_variable_value("<", env); val = const_i32(2); argl = cons(val, NULL); val = lookup_variable_value("n", env); argl = cons(val, argl); if (primitive_procedure(proc) == 1) goto primitivebranch27; goto compiledbranch26; compiledbranch26: continu = &&aftercall25; entry = compiled_procedure_entry(proc); goto *entry; primitivebranch27: val = (*proc->primitive_procedure)(argl); aftercall25: env = restore(env_stack); continu = restore(continu_stack); if(is_false(val)) goto falsebranch8; goto truebranch9; truebranch9: val = const_i32(1); goto *continu; falsebranch8: proc = lookup_variable_value("+", env); save(continu, continu_stack); save(proc, proc_stack); save(env, env_stack); proc = lookup_variable_value("fib", env); save(proc, proc_stack); proc = lookup_variable_value("-", env); val = const_i32(1); argl = cons(val, NULL); val = lookup_variable_value("n", env); argl = cons(val, argl); if (primitive_procedure(proc) == 1) goto primitivebranch18; goto compiledbranch17; compiledbranch17: continu = &&aftercall16; entry = compiled_procedure_entry(proc); goto *entry; primitivebranch18: val = (*proc->primitive_procedure)(argl); aftercall16: argl = cons(val, NULL); proc = restore(proc_stack); if (primitive_procedure(proc) == 1) goto primitivebranch21; goto compiledbranch20; compiledbranch20: continu = &&aftercall19; entry = compiled_procedure_entry(proc); goto *entry; primitivebranch21: val = (*proc->primitive_procedure)(argl); aftercall19: argl = cons(val, NULL); env = restore(env_stack); save(argl, argl_stack); proc = lookup_variable_value("fib", env); save(proc, proc_stack); proc = lookup_variable_value("-", env); val = const_i32(2); argl = cons(val, NULL); val = lookup_variable_value("n", env); argl = cons(val, argl); if (primitive_procedure(proc) == 1) goto primitivebranch12; goto compiledbranch11; compiledbranch11: continu = &&aftercall10; entry = compiled_procedure_entry(proc); goto *entry; primitivebranch12: val = (*proc->primitive_procedure)(argl); aftercall10: argl = cons(val, NULL); proc = restore(proc_stack); if (primitive_procedure(proc) == 1) goto primitivebranch15; goto compiledbranch14; compiledbranch14: continu = &&aftercall13; entry = compiled_procedure_entry(proc); goto *entry; primitivebranch15: val = (*proc->primitive_procedure)(argl); aftercall13: argl = restore(argl_stack); argl = cons(val, argl); proc = restore(proc_stack); continu = restore(continu_stack); if (primitive_procedure(proc) == 1) goto primitivebranch24; goto compiledbranch23; compiledbranch23: entry = compiled_procedure_entry(proc); goto *entry; primitivebranch24: val = (*proc->primitive_procedure)(argl); goto *continu; aftercall22: afterif7: afterlambda4: val = define_variable("fib", val, env); proc = lookup_variable_value("fac", env); val = const_i32(10); argl = cons(val, NULL); if (primitive_procedure(proc) == 1) goto primitivebranch3; goto compiledbranch2; compiledbranch2: continu = &&aftercall1; entry = compiled_procedure_entry(proc); goto *entry; primitivebranch3: val = (*proc->primitive_procedure)(argl); aftercall1: print_datum(val); printf("\n"); }