From 4e3e4e1ccc60331ff8ff4c1c139e9da3c95e2272 Mon Sep 17 00:00:00 2001 From: Kaz Kylheku Date: Mon, 24 Aug 2015 06:37:19 -0700 Subject: New function: shuffle. * eval.c (eval_init): Register shuffle as intrinsic. * lib.c (shuffle): New function. * lib.h (shuffle): Declared. --- lib.c | 43 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) (limited to 'lib.c') diff --git a/lib.c b/lib.c index a39c7a09..27b77808 100644 --- a/lib.c +++ b/lib.c @@ -6166,6 +6166,49 @@ val sort(val seq_in, val lessfun, val keyfun) return seq; } +val shuffle(val seq) +{ + switch (type(seq)) { + case NIL: + return nil; + case CONS: + case LCONS: + if (cdr(seq)) + { + val v = shuffle(vector_list(seq)); + val i, l; + + for (l = seq, i = zero; l; i = succ(i), l = cdr(l)) + rplaca(l, ref(v, i)); + } + return seq; + case LIT: + uw_throwf(error_s, lit("shuffle: ~s is a literal"), seq, nao); + case STR: + case LSTR: + case VEC: + { + val rs = random_state; + val n = length(seq); + val i; + + if (n == zero || n == one) + return seq; + + for (i = pred(n); ge(i, one); i = pred(i)) { + val j = random(rs, succ(i)); + val t = ref(seq, i); + refset(seq, i, ref(seq, j)); + refset(seq, j, t); + } + + return seq; + } + default: + type_mismatch(lit("shuffle: ~s is not a sequence"), seq, nao); + } +} + static val multi_sort_less(val funcs_cons, val llist, val rlist) { cons_bind (funcs, key_funcs, funcs_cons); -- cgit v1.2.3