summaryrefslogtreecommitdiff
path: root/src/lisp/ao_lisp_eval.c
diff options
context:
space:
mode:
authorKeith Packard <keithp@keithp.com>2016-11-02 14:18:54 -0700
committerKeith Packard <keithp@keithp.com>2017-02-20 11:16:49 -0800
commit9e1a787f8828fb7b750ad3310c89a89536ea5286 (patch)
treef39297fc7f73c9c391b0c6bd4e93d8ddcb675d95 /src/lisp/ao_lisp_eval.c
parent8362393a621ea78a96e7f65f602f4bfc7bbd1158 (diff)
altos/lisp: add set/setq and ' in reader
Along with other small fixes Signed-off-by: Keith Packard <keithp@keithp.com>
Diffstat (limited to 'src/lisp/ao_lisp_eval.c')
-rw-r--r--src/lisp/ao_lisp_eval.c13
1 files changed, 10 insertions, 3 deletions
diff --git a/src/lisp/ao_lisp_eval.c b/src/lisp/ao_lisp_eval.c
index b13d4681..2374fdb2 100644
--- a/src/lisp/ao_lisp_eval.c
+++ b/src/lisp/ao_lisp_eval.c
@@ -111,6 +111,9 @@ ao_lisp_eval(ao_poly v)
case AO_LISP_MACRO:
v = ao_lisp_func(b)(ao_lisp_poly_cons(actuals->cdr));
+ DBG("macro "); DBG_POLY(ao_lisp_cons_poly(actuals));
+ DBG(" -> "); DBG_POLY(v);
+ DBG("\n");
if (ao_lisp_poly_type(v) != AO_LISP_CONS) {
ao_lisp_exception |= AO_LISP_INVALID;
return AO_LISP_NIL;
@@ -160,8 +163,9 @@ ao_lisp_eval(ao_poly v)
DBG ("\n");
} else {
ao_lisp_exception |= AO_LISP_INVALID;
- return AO_LISP_NIL;
}
+ if (ao_lisp_exception)
+ return AO_LISP_NIL;
done_eval:
if (--cons) {
struct ao_lisp_cons *frame;
@@ -170,10 +174,13 @@ ao_lisp_eval(ao_poly v)
frame = ao_lisp_poly_cons(stack->car);
actuals = ao_lisp_poly_cons(frame->car);
formals = ao_lisp_poly_cons(frame->cdr);
+ formals_tail = NULL;
/* Recompute the tail of the formals list */
- for (formal = formals; formal->cdr != AO_LISP_NIL; formal = ao_lisp_poly_cons(formal->cdr));
- formals_tail = formal;
+ if (formals) {
+ for (formal = formals; formal->cdr != AO_LISP_NIL; formal = ao_lisp_poly_cons(formal->cdr));
+ formals_tail = formal;
+ }
stack = ao_lisp_poly_cons(stack->cdr);
DBG("stack pop: stack"); DBG_CONS(stack); DBG("\n");