Implement 5.52 translate Scheme to C
This commit is contained in:
@@ -3,27 +3,230 @@
|
||||
#include <stdlib.h>
|
||||
|
||||
#include "datum.h"
|
||||
#include "env.h"
|
||||
#include "stack.h"
|
||||
|
||||
int main() {
|
||||
datum *val;
|
||||
datum *argl[10];
|
||||
datum *proc;
|
||||
void *cont, *entry, *env;
|
||||
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);
|
||||
val = const_int(3);
|
||||
argl[0] = val;
|
||||
val = const_int(42);
|
||||
argl[1] = val;
|
||||
argl[2] = NULL;
|
||||
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:
|
||||
cont = &&aftercall1;
|
||||
continu = &&aftercall1;
|
||||
entry = compiled_procedure_entry(proc);
|
||||
goto *entry;
|
||||
primitivebranch3:
|
||||
val = (*proc->primitive_procedure)((void**) argl);
|
||||
val = (*proc->primitive_procedure)(argl);
|
||||
aftercall1:
|
||||
printf("%u\n", val->value);
|
||||
print_datum(val);
|
||||
printf("\n");
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user