#include "h.h" #include static env work[worksize]; static int wp = worksize; env * gw(){if(!wp) {wp=worksize; Bye("Exhausted!");} return &work[--wp];} void crsh(char* d){printf("%s: compiler bug!", d); exit(0);} val eval(cp x, env * e){ // Use the stack at first uchar op = *x; if (op < 253) {int j = op; while(j--) if (e) e = e->out; else crsh("bad sym\n"); return e->v;} if(op == 254) {cp argE = 3+x+*(us *)(x+1); // Where exp for argument is at. val f = eval(x+3, e); // function to apply val a = eval(argE, e); // argument to apply it to if(f.tag == 2) { if(a.tag) Bye("Numeric operator applied to function"); return f.u.p(a.u.i);} {env * e2 = gw(); *e2 = (env){f.u.f.e, a}; if (f.tag) return eval(f.u.f.c, e2); Bye("number as function");}} if(op == 255) return (val){1, {.f = {e, x+1}}}; if(op == 253) {li y = 0; ++x; do y = y<<7 | (*x & 0x7f); while(*(x++) < 0x80) ; return (val){0, { .i = y }};} crsh("Invalid code\n");}