summaryrefslogtreecommitdiff
path: root/src/lisp/ao_lisp_make_const.c
diff options
context:
space:
mode:
authorKeith Packard <keithp@keithp.com>2017-12-03 19:54:18 -0800
committerKeith Packard <keithp@keithp.com>2017-12-03 19:54:18 -0800
commit9dbc686ad7d3289dc0f9bcf4a973f71100e02ded (patch)
treec64a5e1c981ef3fb6995d361f4b65c1aa8a0f51a /src/lisp/ao_lisp_make_const.c
parenta1d013ab8cc508d4e17ae8876bc5465d1a2dfc1e (diff)
altos/lisp: Switch to scheme formal syntax for varargs
Scheme uses bare symbols to indicate a varargs parameter; any bare (i.e., not wrapped in a cons cell) parameter will get the 'rest' of the parameter list. This works for lambdas, nlambdas and macros. As a result, the 'lexpr' form has been removed as it is equivalent to a lambda with a varargs formal. Signed-off-by: Keith Packard <keithp@keithp.com>
Diffstat (limited to 'src/lisp/ao_lisp_make_const.c')
-rw-r--r--src/lisp/ao_lisp_make_const.c8
1 files changed, 5 insertions, 3 deletions
diff --git a/src/lisp/ao_lisp_make_const.c b/src/lisp/ao_lisp_make_const.c
index f3ea6be0..6e4b411e 100644
--- a/src/lisp/ao_lisp_make_const.c
+++ b/src/lisp/ao_lisp_make_const.c
@@ -191,6 +191,7 @@ ao_has_macro(ao_poly p)
struct ao_lisp_cons *cons;
struct ao_lisp_lambda *lambda;
ao_poly m;
+ ao_poly list;
if (p == AO_LISP_NIL)
return AO_LISP_NIL;
@@ -206,15 +207,16 @@ ao_has_macro(ao_poly p)
if ((p = ao_is_macro(cons->car)))
break;
- cons = ao_lisp_poly_cons(cons->cdr);
+ list = cons->cdr;
p = AO_LISP_NIL;
- while (cons) {
+ while (list != AO_LISP_NIL && ao_lisp_poly_type(list) == AO_LISP_CONS) {
+ cons = ao_lisp_poly_cons(list);
m = ao_has_macro(cons->car);
if (m) {
p = m;
break;
}
- cons = ao_lisp_poly_cons(cons->cdr);
+ list = cons->cdr;
}
break;