summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKaz Kylheku <kaz@kylheku.com>2014-02-10 12:57:33 -0800
committerKaz Kylheku <kaz@kylheku.com>2014-02-10 12:57:33 -0800
commit656a6d4b2efc283b31d540abf87408a67287bbdb (patch)
tree29422331f988d80bdea3fb5332fcfd67882e4873
parent2fccb10283aae350ced4db70fcddcc95e59e503a (diff)
downloadtxr-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--ChangeLog5
-rw-r--r--eval.c19
2 files changed, 14 insertions, 10 deletions
diff --git a/ChangeLog b/ChangeLog
index cee7df5a..48d91ce2 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -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.
diff --git a/eval.c b/eval.c
index c2a82994..6d1d425f 100644
--- a/eval.c
+++ b/eval.c
@@ -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);