diff --git a/fn.h b/fn.h index 6ce961c..d6a5552 100644 --- a/fn.h +++ b/fn.h @@ -3,6 +3,10 @@ Object* nextexpr(FILE*); void skipline(FILE*); +/* repl.c */ +void repl(Object *env, FILE*, char *pre); +void readlibs(char *argv[], Object *env); + /* eval.c */ Object* eval(Object *env, Object *expr); diff --git a/main.c b/main.c index e9dc0c2..799fbdb 100644 --- a/main.c +++ b/main.c @@ -1,37 +1,8 @@ #include "dat.h" #include "fn.h" -#include -#include -#include -jmp_buf err; GC *gc; -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(err, 1); - exit(1); -} - static void SExprint(Object *obj) { @@ -88,33 +59,11 @@ printexpr(Object *obj) printf("\n"); } -static void -loop(Object *env, FILE *f) -{ - if(setjmp(err) == 1){ - if(feof(f)) - return; - skipline(f); - } - while(1){ - printf(">> "); - Object *res = nextexpr(f); - res = eval(env, res); - printexpr(res); - printgc("status", gc); - } -} - int main(int argc, char *argv[]) { gc = newgc(&argc, 400); Object *env = newenv(gc, &Nil, &Nil, &Nil); - for(int i = 1; i < argc; ++i){ - FILE *f = fopen(argv[i], "r"); - if(f == 0) - panic("can't open %s", argv[i]); - loop(env, f); - } - loop(env, stdin); + readlibs(argv + 1, env); + repl(env, stdin, ">> "); } diff --git a/makefile b/makefile index 59335fd..3b13e26 100644 --- a/makefile +++ b/makefile @@ -1,6 +1,7 @@ NAME=lisp OFILES=\ bltin.o\ + repl.o\ eval.o\ main.o\ gc.o\ diff --git a/repl.c b/repl.c new file mode 100644 index 0000000..ee4a2ed --- /dev/null +++ b/repl.c @@ -0,0 +1,63 @@ +#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); +} + +void +repl(Object *env, FILE *f, char *pre) +{ + jmp_buf err; + errptr = &err; + if(setjmp(err) == 1){ + if(feof(f)) + return; + skipline(f); + } + while(1){ + printf(pre); + Object *res = nextexpr(f); + res = eval(env, res); + printexpr(res); + printgc("status", gc); + } +} + +void +readlibs(char *argv[], Object *env) +{ + for(;*argv; argv++){ + FILE *f = fopen(*argv, "r"); + if(f == 0) + panic("can't open %s", *argv); + repl(env, f, ""); + printf("\n"); + } +}