diff --git a/lval/expressions.c b/lval/expressions.c index 726d779..b15614b 100644 --- a/lval/expressions.c +++ b/lval/expressions.c @@ -57,6 +57,7 @@ lval* lval_take(lval* v, int i) { lval* lval_eval_sexpr(lenv* e, lval* v) { // No argument functions if (v->count == 1 && v->cell[0]->type == LVAL_SYM) { + if (strcmp(v->cell[0]->sym, "exit") == 0) { return v; } lval* x = lenv_get(e, v->cell[0]); if (x->type == LVAL_FUN) { lval_del(x); @@ -64,8 +65,10 @@ lval* lval_eval_sexpr(lenv* e, lval* v) { lval_del(v); return builtin_ls(e, lval_sexpr()); } + return v; } - + if (x->type == LVAL_ERR) { lval_del(v); return x; } + lval_del(x); return v; } // Evaluate children diff --git a/prompt.c b/prompt.c index 5d582d4..ee13bf6 100644 --- a/prompt.c +++ b/prompt.c @@ -83,9 +83,13 @@ int main (int argc, char** argv) { // lval result = eval(r.output); lval* result = lval_eval(e, lval_read(r.output)); lval_println(result); - lval_del(result); // mpc_ast_print(r.output); mpc_ast_delete(r.output); + if ((result->type == LVAL_SEXPR && result->count > 0 && strcmp(result->cell[0]->sym, "exit") == 0) || + (result->type == LVAL_SYM && strcmp(result->sym, "exit") == 0)) + { lval_del(result); free(input); break; } + lval_del(result); + } else { // Otherwise print the error mpc_err_print(r.error);