diff options
author | Kaz Kylheku <kaz@kylheku.com> | 2023-12-27 15:45:25 -0800 |
---|---|---|
committer | Kaz Kylheku <kaz@kylheku.com> | 2023-12-27 15:45:25 -0800 |
commit | 2b4dff1bc2c3274201cdda958037b9065ca974bf (patch) | |
tree | e385aeeb1b8d5b8acacf06ca197e599137e27f0c /combi.c | |
parent | b8dd7f02e01072c928ffa7a37b662ab1644faeaa (diff) | |
download | txr-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.c | 23 |
1 files changed, 15 insertions, 8 deletions
@@ -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)); } |