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>2016-11-17 22:18:39 -0800
commitd134a38c57429070ee5d4f74dafca4489e4b1443 (patch)
treef95eb5c657849f0831f0b4695c7dfe674422c453 /src/lisp/ao_lisp_eval.c
parentd92f8ca0d279ce6968bafefe4cd265e80e55123f (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");