diff options
| author | Keith Packard <keithp@keithp.com> | 2016-11-02 14:18:54 -0700 | 
|---|---|---|
| committer | Keith Packard <keithp@keithp.com> | 2017-02-20 11:16:49 -0800 | 
| commit | 9e1a787f8828fb7b750ad3310c89a89536ea5286 (patch) | |
| tree | f39297fc7f73c9c391b0c6bd4e93d8ddcb675d95 /src/lisp/ao_lisp_eval.c | |
| parent | 8362393a621ea78a96e7f65f602f4bfc7bbd1158 (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.c | 13 | 
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");  | 
