projects
/
fw
/
altos
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
altos/lisp: add set/setq and ' in reader
[fw/altos]
/
src
/
lisp
/
ao_lisp_eval.c
diff --git
a/src/lisp/ao_lisp_eval.c
b/src/lisp/ao_lisp_eval.c
index b13d4681480b74b96e2bad5e75260e9e5c1dc459..2374fdb2139fadfcaa61bd230fbe01c04c600f67 100644
(file)
--- 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));
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;
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;
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;
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);
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 */
/* 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");
stack = ao_lisp_poly_cons(stack->cdr);
DBG("stack pop: stack"); DBG_CONS(stack); DBG("\n");