From 656a6d4b2efc283b31d540abf87408a67287bbdb Mon Sep 17 00:00:00 2001 From: Kaz Kylheku Date: Mon, 10 Feb 2014 12:57:33 -0800 Subject: * eval.c (rcomb_gen_fun_common): Streamlined implementation. Got rid of stack that is consed up on each call. --- ChangeLog | 5 +++++ eval.c | 19 +++++++++---------- 2 files changed, 14 insertions(+), 10 deletions(-) diff --git a/ChangeLog b/ChangeLog index cee7df5a..48d91ce2 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +2014-02-10 Kaz Kylheku + + * eval.c (rcomb_gen_fun_common): Streamlined implementation. + Got rid of stack that is consed up on each call. + 2014-02-10 Kaz Kylheku Relaxed behavior: don't throw errors for impossible permutations, 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); -- cgit v1.2.3