diff options
author | Kaz Kylheku <kaz@kylheku.com> | 2014-07-29 06:57:00 -0700 |
---|---|---|
committer | Kaz Kylheku <kaz@kylheku.com> | 2014-07-29 06:57:00 -0700 |
commit | 73e7fd1df88999b02e89cd497e9baeb9a1a6bb40 (patch) | |
tree | 0376dc71ff41e8e9136c915b34aef6a2d4d028bf /eval.c | |
parent | 2014daea4ca5a4f92afc07bbc08dfdcb6c095a12 (diff) | |
download | txr-73e7fd1df88999b02e89cd497e9baeb9a1a6bb40.tar.gz txr-73e7fd1df88999b02e89cd497e9baeb9a1a6bb40.tar.bz2 txr-73e7fd1df88999b02e89cd497e9baeb9a1a6bb40.zip |
* eval.c (giterate_func, giterate): Adjusting semantics of giterate to
include seed item in the sequence. The while test is applied to
each item before it is passed through the function. Also,
eliminated useless rplacd operation.
* txr.1: Updated documentation of giterate.
Diffstat (limited to 'eval.c')
-rw-r--r-- | eval.c | 10 |
1 files changed, 3 insertions, 7 deletions
@@ -3160,12 +3160,9 @@ val generate(val while_pred, val gen_fun) static val giterate_func(val env, val lcons) { cons_bind (while_pred, gen_fun, env); - val value = lcons->lc.car; + val next_item = funcall1(gen_fun, lcons->lc.car); - if (!funcall1(while_pred, value)) { - rplacd(lcons, nil); - } else { - val next_item = funcall1(gen_fun, value); + if (funcall1(while_pred, next_item)) { val lcons_next = make_lazy_cons(lcons_fun(lcons)); rplacd(lcons, lcons_next); rplaca(lcons_next, next_item); @@ -3180,9 +3177,8 @@ static val giterate(val while_pred, val gen_fun, val init_val) if (!funcall1(while_pred, init_val)) { return nil; } else { - val first_item = funcall1(gen_fun, init_val); val lc = make_lazy_cons(func_f1(cons(while_pred, gen_fun), giterate_func)); - rplaca(lc, first_item); + rplaca(lc, init_val); return lc; } } |