diff options
author | Kaz Kylheku <kaz@kylheku.com> | 2019-03-18 06:50:54 -0700 |
---|---|---|
committer | Kaz Kylheku <kaz@kylheku.com> | 2019-03-18 06:50:54 -0700 |
commit | ab87b9f00673e65b6648ace026a815cc8e7ac542 (patch) | |
tree | a5853ef60ea7e3160ae7c25668c76af80e1f9903 /lib.c | |
parent | 5d70f93d01f32b71fb37c589b5e48997fbfb818f (diff) | |
download | txr-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.c | 61 |
1 files changed, 31 insertions, 30 deletions
@@ -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) |