From c565e2fc221b6fd2aea43a12059b15ee91ebd62f Mon Sep 17 00:00:00 2001 From: Jan Nieuwenhuizen Date: Sun, 17 Jul 2016 09:17:47 +0200 Subject: [PATCH] mes.c: begin_env: bugfix, keep going in body after set! --- mes.c | 17 +++++++++-------- test.mes | 2 ++ 2 files changed, 11 insertions(+), 8 deletions(-) diff --git a/mes.c b/mes.c index 684841ac..77264a64 100644 --- a/mes.c +++ b/mes.c @@ -1110,15 +1110,16 @@ eval_quasiquote (scm *e, scm *a) #endif if (e == &scm_nil) return e; else if (atom_p (e) == &scm_t) return e; - else if (eq_p (car (e), &scm_symbol_quote) == &scm_t) - return cons (car (e), eval_quasiquote (cdr (e), a)); - else if (eq_p (car (e), &scm_symbol_quasiquote) == &scm_t) - return cons (e, eval_quasiquote (cdr (e), a)); + // else if (eq_p (car (e), &scm_symbol_quote) == &scm_t) + // return cons (car (e), eval_quasiquote (cdr (e), a)); + // else if (eq_p (car (e), &scm_symbol_quasiquote) == &scm_t) + // return cons (e, eval_quasiquote (cdr (e), a)); else if (eq_p (car (e), &scm_symbol_unquote) == &scm_t) return eval (cadr (e), a); - else if (atom_p (car (e)) == &scm_t) - return cons (car (e), eval_quasiquote (cdr (e), a)); - else if (eq_p (caar (e), &scm_symbol_unquote_splicing) == &scm_t) + // else if (atom_p (car (e)) == &scm_t) + // return cons (car (e), eval_quasiquote (cdr (e), a)); + else if (e->type == PAIR && e->car->type == PAIR + && eq_p (caar (e), &scm_symbol_unquote_splicing) == &scm_t) return append2 (eval_ (cadar (e), a), eval_quasiquote (cdr (e), a)); return cons (eval_quasiquote (car (e), a), eval_quasiquote (cdr (e), a)); } @@ -1217,7 +1218,7 @@ begin_env (scm *body, scm *a) return begin_env (cdr (body), cons (define_macro (e, a), a)); else if (eq_p (car (e), &scm_symbol_set_x) == &scm_t) { set_env_x (cadr (e), eval (caddr (e), a), a); - return begin_env (cdr (e), a); + return begin_env (cdr (body), a); } #if BOOT else if (eq_p (e, &scm_symbol_EOF) == &scm_t) diff --git a/test.mes b/test.mes index 964ab48e..eb88bbad 100644 --- a/test.mes +++ b/test.mes @@ -129,6 +129,8 @@ (display 'a=0:) (display a) (newline) +(display "set!") +(display (set! a 1)) (set! a 1) (display 'a=1:) (display a)