233 lines
6.5 KiB
C
233 lines
6.5 KiB
C
#include <stdio.h>
|
|
#include <stdint.h>
|
|
#include <stdlib.h>
|
|
|
|
#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");
|
|
}
|
|
|