summaryrefslogtreecommitdiffstats
path: root/combi.c
diff options
context:
space:
mode:
authorKaz Kylheku <kaz@kylheku.com>2023-12-27 15:45:25 -0800
committerKaz Kylheku <kaz@kylheku.com>2023-12-27 15:45:25 -0800
commit2b4dff1bc2c3274201cdda958037b9065ca974bf (patch)
treee385aeeb1b8d5b8acacf06ca197e599137e27f0c /combi.c
parentb8dd7f02e01072c928ffa7a37b662ab1644faeaa (diff)
downloadtxr-2b4dff1bc2c3274201cdda958037b9065ca974bf.tar.gz
txr-2b4dff1bc2c3274201cdda958037b9065ca974bf.tar.bz2
txr-2b4dff1bc2c3274201cdda958037b9065ca974bf.zip
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.
Diffstat (limited to 'combi.c')
-rw-r--r--combi.c23
1 files 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));
}