SICP/shared/scm2c/main.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");
}