summaryrefslogtreecommitdiffstats
path: root/lib.c
diff options
context:
space:
mode:
authorKaz Kylheku <kaz@kylheku.com>2019-03-18 06:50:54 -0700
committerKaz Kylheku <kaz@kylheku.com>2019-03-18 06:50:54 -0700
commitab87b9f00673e65b6648ace026a815cc8e7ac542 (patch)
treea5853ef60ea7e3160ae7c25668c76af80e1f9903 /lib.c
parent5d70f93d01f32b71fb37c589b5e48997fbfb818f (diff)
downloadtxr-ab87b9f00673e65b6648ace026a815cc8e7ac542.tar.gz
txr-ab87b9f00673e65b6648ace026a815cc8e7ac542.tar.bz2
txr-ab87b9f00673e65b6648ace026a815cc8e7ac542.zip
partition, split, split*: eliminate state conses.
* lib.c (partition_func, split_func, split_star_func, partition_split_common): Store three context elements in function's env, and lcons car/cdr.
Diffstat (limited to 'lib.c')
-rw-r--r--lib.c61
1 files changed, 31 insertions, 30 deletions
diff --git a/lib.c b/lib.c
index 071cf8c7..acb7a56e 100644
--- a/lib.c
+++ b/lib.c
@@ -2354,10 +2354,9 @@ val partition_by(val func, val seq)
funcall1(func, car(seq)), seq);
}
-static val partition_func(val env, val lcons)
+static val partition_func(val base, val lcons)
{
- us_cons_bind (seq, indices_base, env);
- us_cons_bind (indices, base, indices_base);
+ us_cons_bind (seq, indices, lcons);
val len = nil;
for (;;) {
@@ -2374,17 +2373,19 @@ static val partition_func(val env, val lcons)
val first = sub(seq, zero, index_rebased);
val rest = nullify(sub(seq, index_rebased, t));
- us_rplaca(env, rest);
- us_rplaca(indices_base, indices);
- us_rplacd(indices_base, index);
-
- if (rest)
- us_rplacd(lcons, make_lazy_cons(us_lcons_fun(lcons)));
+ if (rest) {
+ val fun = us_lcons_fun(lcons);
+ us_func_set_env(fun, index);
+ us_rplacd(lcons, make_lazy_cons_car_cdr(fun, rest, indices));
+ } else {
+ us_rplacd(lcons, nil);
+ }
us_rplaca(lcons, first);
}
} else {
us_rplaca(lcons, seq);
+ us_rplacd(lcons, nil);
}
break;
}
@@ -2392,10 +2393,9 @@ static val partition_func(val env, val lcons)
return nil;
}
-static val split_func(val env, val lcons)
+static val split_func(val base, val lcons)
{
- us_cons_bind (seq, indices_base, env);
- us_cons_bind (indices, base, indices_base);
+ us_cons_bind (seq, indices, lcons);
val len = nil;
for (;;) {
@@ -2413,18 +2413,19 @@ static val split_func(val env, val lcons)
val rsub = sub(seq, index_rebased, t);
val rest = nullify(rsub);
- us_rplaca(env, rest);
- us_rplaca(indices_base, indices);
- us_rplacd(indices_base, index);
-
- us_rplacd(lcons, if3(rest,
- make_lazy_cons(us_lcons_fun(lcons)),
- cons(rsub, nil)));
+ if (rest) {
+ val fun = us_lcons_fun(lcons);
+ us_func_set_env(fun, index);
+ us_rplacd(lcons, make_lazy_cons_car_cdr(fun, rest, indices));
+ } else {
+ us_rplacd(lcons, cons(rsub, nil));
+ }
us_rplaca(lcons, first);
}
} else {
us_rplaca(lcons, seq);
+ us_rplacd(lcons, nil);
}
break;
}
@@ -2432,10 +2433,9 @@ static val split_func(val env, val lcons)
return nil;
}
-static val split_star_func(val env, val lcons)
+static val split_star_func(val base, val lcons)
{
- us_cons_bind (seq, indices_base, env);
- us_cons_bind (indices, base, indices_base);
+ us_cons_bind (seq, indices, lcons);
val len = nil;
for (;;) {
@@ -2453,18 +2453,19 @@ static val split_star_func(val env, val lcons)
val rsub = sub(seq, succ(index_rebased), t);
val rest = nullify(rsub);
- us_rplaca(env, rest);
- us_rplaca(indices_base, indices);
- us_rplacd(indices_base, succ(index));
-
- us_rplacd(lcons, if3(rest,
- make_lazy_cons(us_lcons_fun(lcons)),
- cons(rsub, nil)));
+ if (rest) {
+ val fun = us_lcons_fun(lcons);
+ us_func_set_env(fun, succ(index));
+ us_rplacd(lcons, make_lazy_cons_car_cdr(fun, rest, indices));
+ } else {
+ us_rplacd(lcons, cons(rsub, nil));
+ }
us_rplaca(lcons, first);
}
} else {
us_rplaca(lcons, seq);
+ us_rplacd(lcons, nil);
}
break;
}
@@ -2491,7 +2492,7 @@ static val partition_split_common(val seq, val indices,
if (!seqp(indices))
indices = cons(indices, nil);
- return make_lazy_cons(func_f1(cons(seq, cons(indices, zero)), split_fptr));
+ return make_lazy_cons_car_cdr(func_f1(zero, split_fptr), seq, indices);
}
val partition(val seq, val indices)