From d67e97e6991fe2d6c8414feda7d72f0ee24f0a9f Mon Sep 17 00:00:00 2001 From: Kaz Kylheku Date: Tue, 29 Dec 2020 00:26:21 -0800 Subject: shuffle/nshuffle: take optional random state argument. * eval.c (eval_init): Register shuffle and nshuffle as two-argument functions with optional argument. * lib.c (nshuffle): Take random-state argument, defaulting to value of random_state special variable. (shuffle): Take random-state argument, pass down to nshuffle. * lib.h (shuffle, nshuffle): Declarations updated. * txr.1: Updated. --- eval.c | 4 ++-- lib.c | 8 ++++---- lib.h | 4 ++-- txr.1 | 8 +++++--- 4 files changed, 13 insertions(+), 11 deletions(-) diff --git a/eval.c b/eval.c index aaf34aaf..a19524a6 100644 --- a/eval.c +++ b/eval.c @@ -6927,9 +6927,9 @@ void eval_init(void) reg_fun(intern(lit("nsort"), user_package), func_n3o(nsort, 1)); reg_fun(intern(lit("sort"), user_package), func_n3o(if3(opt_compat && opt_compat <= 237, nsort, sort), 1)); - reg_fun(intern(lit("nshuffle"), user_package), func_n1(nshuffle)); + reg_fun(intern(lit("nshuffle"), user_package), func_n2o(nshuffle, 1)); reg_fun(intern(lit("shuffle"), user_package), - func_n1(if3(opt_compat && opt_compat <= 237, nshuffle, shuffle))); + func_n2o(if3(opt_compat && opt_compat <= 237, nshuffle, shuffle), 1)); reg_fun(intern(lit("find"), user_package), func_n4o(find, 2)); reg_fun(intern(lit("rfind"), user_package), func_n4o(rfind, 2)); reg_fun(intern(lit("find-if"), user_package), func_n3o(find_if, 2)); diff --git a/lib.c b/lib.c index b3873c95..462e19a8 100644 --- a/lib.c +++ b/lib.c @@ -9653,7 +9653,7 @@ val sort(val seq, val lessfun, val keyfun) abort(); } -val nshuffle(val seq) +val nshuffle(val seq, val randstate) { seq_info_t si = seq_info(seq); @@ -9673,7 +9673,7 @@ val nshuffle(val seq) case SEQ_VECLIKE: case SEQ_HASHLIKE: { - val rs = random_state; + val rs = default_arg(randstate, random_state); val n = length(seq); val i; @@ -9696,10 +9696,10 @@ val nshuffle(val seq) abort(); } -val shuffle(val seq) +val shuffle(val seq, val randstate) { if (seqp(seq)) - return nshuffle(copy(seq)); + return nshuffle(copy(seq), randstate); type_mismatch(lit("nshuffle: ~s is not a sequence"), seq, nao); } diff --git a/lib.h b/lib.h index 535c2c45..c1951a88 100644 --- a/lib.h +++ b/lib.h @@ -1129,8 +1129,8 @@ val interpose(val sep, val seq); val merge(val list1, val list2, val lessfun, val keyfun); val nsort(val seq, val lessfun, val keyfun); val sort(val seq, val lessfun, val keyfun); -val nshuffle(val seq); -val shuffle(val seq); +val nshuffle(val seq, val randstate); +val shuffle(val seq, val randstate); val multi_sort(val lists, val funcs, val key_funcs); val sort_group(val seq, val keyfun, val lessfun); val unique(val seq, val keyfun, struct args *hashv_args); diff --git a/txr.1 b/txr.1 index e287c8bb..1829471c 100644 --- a/txr.1 +++ b/txr.1 @@ -33727,8 +33727,8 @@ in the APL language. .coNP Functions @ shuffle and @ nshuffle .synb -.mets (shuffle << sequence ) -.mets (nshuffle << sequence ) +.mets (shuffle < sequence <> [ random-state ]) +.mets (nshuffle < sequence <> [ random-state ]) .syne .desc The @@ -33745,7 +33745,9 @@ itself. The rearrangement depends on pseudo-random numbers obtained from the .code rand -function. +function. The +.meta random-state +argument, if present, is passed to that function. The .code nshuffle -- cgit v1.2.3