diff options
author | Kaz Kylheku <kaz@kylheku.com> | 2014-02-10 12:57:33 -0800 |
---|---|---|
committer | Kaz Kylheku <kaz@kylheku.com> | 2014-02-10 12:57:33 -0800 |
commit | 656a6d4b2efc283b31d540abf87408a67287bbdb (patch) | |
tree | 29422331f988d80bdea3fb5332fcfd67882e4873 | |
parent | 2fccb10283aae350ced4db70fcddcc95e59e503a (diff) | |
download | txr-656a6d4b2efc283b31d540abf87408a67287bbdb.tar.gz txr-656a6d4b2efc283b31d540abf87408a67287bbdb.tar.bz2 txr-656a6d4b2efc283b31d540abf87408a67287bbdb.zip |
* eval.c (rcomb_gen_fun_common): Streamlined implementation.
Got rid of stack that is consed up on each call.
-rw-r--r-- | ChangeLog | 5 | ||||
-rw-r--r-- | eval.c | 19 |
2 files changed, 14 insertions, 10 deletions
@@ -1,5 +1,10 @@ 2014-02-10 Kaz Kylheku <kaz@kylheku.com> + * eval.c (rcomb_gen_fun_common): Streamlined implementation. + Got rid of stack that is consed up on each call. + +2014-02-10 Kaz Kylheku <kaz@kylheku.com> + Relaxed behavior: don't throw errors for impossible permutations, but return an empty list. @@ -2558,22 +2558,21 @@ static val rcomb_while_fun(val state) static void rcomb_gen_fun_common(val state) { val iter; - val rev = nil; + val next; - for (iter = state; consp(iter); iter = cdr(iter)) { + for (iter = state, next = cdr(state); + consp(iter); + iter = next, next = cdr(iter)) + { val curr = first(iter); val curr_rest = rest(curr); - push(iter, &rev); - if (consp(curr_rest)) { - val iter2; - for (iter2 = rev; iter2; iter2 = cdr(iter2)) { - val revit = car(iter2); - *car_l(revit) = curr_rest; - } + val jter; + for (jter = state; jter != next; jter = cdr(jter)) + *car_l(jter) = curr_rest; return; - } else if (rest(iter)) { + } else if (next) { val next = second(iter); if (curr != next) *car_l(iter) = rest(next); |