From 2b4dff1bc2c3274201cdda958037b9065ca974bf Mon Sep 17 00:00:00 2001 From: Kaz Kylheku Date: Wed, 27 Dec 2023 15:45:25 -0800 Subject: rperm: change state representation to vector. * combi.c (rperm_init): New static function. (rperm_while_fun, rperm_gen_fun): Retrieve state info from vector-based state rather than cons. (rperm_list, rperm_vec, rperm_str): Call rperm_init to allocate state. --- combi.c | 23 +++++++++++++++-------- 1 file changed, 15 insertions(+), 8 deletions(-) diff --git a/combi.c b/combi.c index 79787f04..c674686d 100644 --- a/combi.c +++ b/combi.c @@ -262,16 +262,26 @@ val perm(val seq, val k) } } +static val rperm_init(val list, val k) +{ + val vec = vector(k, list); + val env = vector(two, nil); + set(vecref_l(env, zero), list); + set(vecref_l(env, one), vec); + return env; +} + static val rperm_while_fun(val env) { - val vec = cdr(env); + val vec = env->v.vec[1]; return consp(vecref(vec, zero)); } static val rperm_gen_fun(val env) { val self = lit("rperm"); - cons_bind (list, vec, env); + val list = env->v.vec[0]; + val vec = env->v.vec[1]; list_collect_decl(out, ptail); cnum i; cnum len = c_num(length_vec(vec), self); @@ -292,8 +302,7 @@ static val rperm_gen_fun(val env) static val rperm_list(val list, val k) { - val vec = vector(k, list); - val env = cons(list, vec); + val env = rperm_init(list, k); return generate(func_f0(env, rperm_while_fun), func_f0(env, rperm_gen_fun)); } @@ -307,8 +316,7 @@ static val rperm_vec_gen_fun(val env) static val rperm_vec(val ve, val k) { val list = list_vec(ve); - val vec = vector(k, list); - val env = cons(list, vec); + val env = rperm_init(list, k); return generate(func_f0(env, rperm_while_fun), func_f0(env, rperm_vec_gen_fun)); } @@ -322,8 +330,7 @@ static val rperm_str_gen_fun(val env) static val rperm_str(val str, val k) { val list = list_str(str); - val vec = vector(k, list); - val env = cons(list, vec); + val env = rperm_init(list, k); return generate(func_f0(env, rperm_while_fun), func_f0(env, rperm_str_gen_fun)); } -- cgit v1.2.3