#include "dat.h" #include "fn.h" #include #include #include jmp_buf *errptr; void panic(char *fmt, ...) { va_list ap; va_start(ap, fmt); vfprintf(stderr, fmt, ap); va_end(ap); fprintf(stderr, "\n"); exit(1); } void error(char *fmt, ...) { va_list ap; va_start(ap, fmt); fprintf(stderr, "ERROR => "); vfprintf(stderr, fmt, ap); va_end(ap); fprintf(stderr, "\n"); longjmp(*errptr, 1); exit(1); } static void repl(Object *env, FILE *f, char *pre) { jmp_buf err; errptr = &err; if(setjmp(err) == 1){ if(feof(f)) exit(1); skipline(f); } while(1){ printf(pre); Object *res = nextexpr(f); res = eval(env, res); printexpr(res); printgc("status", gc); } } static void readlib(FILE *f, Object *env) { jmp_buf buf; errptr = &buf; if(setjmp(buf) == 1) return; while(1){ eval(env, nextexpr(f)); } panic("unreachable"); errptr = 0; } void lispmain(char *argv[]) { Object *env = newenv(gc , &Nil, &Nil, &Nil); for(; *argv; ++argv){ FILE *f = fopen(*argv, "r"); if(f == 0) panic("can't open %s'", *argv); readlib(f, env); fclose(f); } repl(env, stdin, ">> "); }