diff --git a/macro.lisp b/macro.lisp new file mode 100644 index 0000000..801477e --- /dev/null +++ b/macro.lisp @@ -0,0 +1,10 @@ +(defn list (x . y) (cons x y)) + +(macro cond (expr. rest) + (if rest (list 'if (car expr) (car (cdr expr)) (cons 'cond rest)) + expr)) + +(macro and (expr . rest) + (if rest (list 'if expr (cons 'and rest)) expr)) + +;(cond ((== 1 0) 0) ((== 1 1) -1) (+ 100000000)) diff --git a/main.c b/main.c index b3f6bda..942d13a 100644 --- a/main.c +++ b/main.c @@ -72,15 +72,12 @@ loop(Object *env, FILE *f) skipline(f); } while(1){ + printf(">> "); Object *res = nextexpr(f); printexpr(res); res = eval(env, res); printgc("status", gc); - printf("=============res===========\n"); printexpr(res); - printf("=============env===========\n"); - printexpr(env); - printf("===========================\n"); } } @@ -89,5 +86,11 @@ 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); } diff --git a/parser.c b/parser.c index 5200009..7d5e6ea 100644 --- a/parser.c +++ b/parser.c @@ -145,8 +145,12 @@ lparlist(FILE *f) static Object* list(FILE *f) { +redo: char c = slookup(f); switch(c){ + case ';': + skipline(f); + goto redo; case '\'': get(f); return quote(f);