summaryrefslogtreecommitdiffstats
path: root/eval.c
diff options
context:
space:
mode:
authorKaz Kylheku <kaz@kylheku.com>2014-07-08 19:05:25 -0700
committerKaz Kylheku <kaz@kylheku.com>2014-07-08 19:05:25 -0700
commit4c27a4aa97bf791b1c88ef41df620d355a8437dd (patch)
tree077979526f87b9e5554332011747d09816357ad5 /eval.c
parent0a7ba78d65499ec2a911823bec94988e06c2539f (diff)
downloadtxr-4c27a4aa97bf791b1c88ef41df620d355a8437dd.tar.gz
txr-4c27a4aa97bf791b1c88ef41df620d355a8437dd.tar.bz2
txr-4c27a4aa97bf791b1c88ef41df620d355a8437dd.zip
* eval.c (bindings_helper): New parameter to indicate that
the caller needs the return value, so the function can avoid consing up a list that will be thrown away. (op_let): Pass nil argument to new parameter of bindings_helper. (op_each, op_for): Pass t to indicate that the return value is needed.
Diffstat (limited to 'eval.c')
-rw-r--r--eval.c15
1 files changed, 9 insertions, 6 deletions
diff --git a/eval.c b/eval.c
index 6f059468..0457864b 100644
--- a/eval.c
+++ b/eval.c
@@ -1019,7 +1019,8 @@ static val op_unquote_error(val form, val env)
static val bindings_helper(val vars, val env, val sequential,
- val *env_out, val ctx_form)
+ val *env_out, val ret_new_bindings,
+ val ctx_form)
{
val iter;
val de = if3(sequential, dyn_env, make_env(nil, nil, dyn_env));
@@ -1040,11 +1041,13 @@ static val bindings_helper(val vars, val env, val sequential,
if (var == special_s) {
val special = car(item);
val binding = env_vbind(de, special, value);
- ptail = list_collect (ptail, binding);
+ if (ret_new_bindings)
+ ptail = list_collect (ptail, binding);
} else if (bindable(var)) {
val le = if3(sequential, make_env(nil, nil, ne), ne);
val binding = env_vbind(le, var, value);
- ptail = list_collect (ptail, binding);
+ if (ret_new_bindings)
+ ptail = list_collect (ptail, binding);
ne = le;
} else {
eval_error(ctx_form, lit("~s: ~s is not a bindable symbol"),
@@ -1076,7 +1079,7 @@ static val op_let(val form, val env)
val vars = first(args);
val body = rest(args);
val new_env;
- (void) bindings_helper(vars, env, eq(let, let_star_s), &new_env, form);
+ (void) bindings_helper(vars, env, eq(let, let_star_s), &new_env, nil, form);
return eval_progn(body, new_env, form);
}
@@ -1093,7 +1096,7 @@ static val op_each(val form, val env)
val collect = or2(eq(each, collect_each_s), eq(each, collect_each_star_s));
val append = or2(eq(each, append_each_s), eq(each, append_each_star_s));
val new_env;
- val new_bindings = bindings_helper(vars, env, star, &new_env, form);
+ val new_bindings = bindings_helper(vars, env, star, &new_env, t, form);
val lists = mapcar(cdr_f, new_bindings);
list_collect_decl (collection, ptail);
@@ -1767,7 +1770,7 @@ static val op_for(val form, val env)
val forms = rest(rest(rest(rest(form))));
val new_env;
val new_bindings = bindings_helper(vars, env, eq(forsym, for_star_s),
- &new_env, form);
+ &new_env, t, form);
uw_block_begin (nil, result);
(void) new_bindings;