summaryrefslogtreecommitdiff
path: root/src/lisp/ao_lisp_lambda.c
diff options
context:
space:
mode:
authorKeith Packard <keithp@keithp.com>2016-11-18 22:41:46 -0800
committerKeith Packard <keithp@keithp.com>2017-02-20 11:16:52 -0800
commitc3a4d7721f0f5d082336b8cc9c9d765ad2f7d17e (patch)
tree6a9d93d8450e290c57a03db3e9c1025c4a75dcd1 /src/lisp/ao_lisp_lambda.c
parent8f833f31f625526a5f1e9a1bd561733b5bb2bcaa (diff)
altos/lisp: Sort frames by atom
Fortunately, the collector always retains the relative order between addresses, so we can sort based on the atom address itself. This reduces the time spent looking for names in larger (e.g. global) frames. Signed-off-by: Keith Packard <keithp@keithp.com>
Diffstat (limited to 'src/lisp/ao_lisp_lambda.c')
-rw-r--r--src/lisp/ao_lisp_lambda.c9
1 files changed, 3 insertions, 6 deletions
diff --git a/src/lisp/ao_lisp_lambda.c b/src/lisp/ao_lisp_lambda.c
index b164cd66..526863c5 100644
--- a/src/lisp/ao_lisp_lambda.c
+++ b/src/lisp/ao_lisp_lambda.c
@@ -166,8 +166,7 @@ ao_lisp_lambda_eval(void)
case AO_LISP_FUNC_LAMBDA:
for (f = 0; f < args_wanted; f++) {
DBGI("bind "); DBG_POLY(args->car); DBG(" = "); DBG_POLY(vals->car); DBG("\n");
- next_frame->vals[f].atom = args->car;
- next_frame->vals[f].val = vals->car;
+ ao_lisp_frame_bind(next_frame, f, args->car, vals->car);
args = ao_lisp_poly_cons(args->cdr);
vals = ao_lisp_poly_cons(vals->cdr);
}
@@ -180,14 +179,12 @@ ao_lisp_lambda_eval(void)
case AO_LISP_FUNC_MACRO:
for (f = 0; f < args_wanted - 1; f++) {
DBGI("bind "); DBG_POLY(args->car); DBG(" = "); DBG_POLY(vals->car); DBG("\n");
- next_frame->vals[f].atom = args->car;
- next_frame->vals[f].val = vals->car;
+ ao_lisp_frame_bind(next_frame, f, args->car, vals->car);
args = ao_lisp_poly_cons(args->cdr);
vals = ao_lisp_poly_cons(vals->cdr);
}
DBGI("bind "); DBG_POLY(args->car); DBG(" = "); DBG_POLY(ao_lisp_cons_poly(vals)); DBG("\n");
- next_frame->vals[f].atom = args->car;
- next_frame->vals[f].val = ao_lisp_cons_poly(vals);
+ ao_lisp_frame_bind(next_frame, f, args->car, ao_lisp_cons_poly(vals));
break;
default:
break;