summaryrefslogtreecommitdiffstats
path: root/lib.c
diff options
context:
space:
mode:
authorKaz Kylheku <kaz@kylheku.com>2023-09-25 20:21:58 -0700
committerKaz Kylheku <kaz@kylheku.com>2023-09-25 20:21:58 -0700
commitf1c442b84179092d93b42fbf629fe7337bf177ba (patch)
tree807e0145ff781a327db461efe0b74bce0a2481e1 /lib.c
parent08e99752e3d29f69dd661aaba3b7809a117264d9 (diff)
downloadtxr-f1c442b84179092d93b42fbf629fe7337bf177ba.tar.gz
txr-f1c442b84179092d93b42fbf629fe7337bf177ba.tar.bz2
txr-f1c442b84179092d93b42fbf629fe7337bf177ba.zip
New hist-sort function.
* eval.c (eval_init): Register hist-sort intrinsic. * lib.c (gt_f): New global variable. (hist_succ_f): New static variable. (hist_succ): New static function. (hist_sort): New function. * lib.h (gt_f, hist_sort): Declared. * tests/012/sort.tl: New tests. * txr.1: Documented.
Diffstat (limited to 'lib.c')
-rw-r--r--lib.c25
1 files changed, 22 insertions, 3 deletions
diff --git a/lib.c b/lib.c
index a4f5db85..8d0317c7 100644
--- a/lib.c
+++ b/lib.c
@@ -133,7 +133,7 @@ val nil_string;
val identity_f, identity_star_f;
val equal_f, eql_f, eq_f, car_f, cdr_f, null_f;
-val list_f, less_f, greater_f;
+val list_f, less_f, greater_f, gt_f;
val prog_string;
@@ -175,6 +175,8 @@ const seq_kind_t seq_kind_tab[MAXTYPE+1] = {
SEQ_NOTSEQ, /* DARG */
};
+static val hist_succ_f;
+
val identity(val obj)
{
return obj;
@@ -11565,6 +11567,20 @@ val grade(val seq, val lessfun, val keyfun_in)
return nil;
}
+static val hist_succ(val left, val right)
+{
+ (void) right;
+ return succ(left);
+}
+
+val hist_sort(val seq, varg hashv_args)
+{
+ val hash = group_reduce(hashv(hashv_args),
+ identity_f, hist_succ_f,
+ seq, zero, nil);
+ return nsort(hash_alist(hash), gt_f, cdr_f);
+}
+
val nrot(val seq, val n_in)
{
val len = length(seq);
@@ -13957,8 +13973,8 @@ static void obj_init(void)
&user_package, &public_package,
&equal_f, &eq_f, &eql_f,
&car_f, &cdr_f, &null_f, &list_f,
- &identity_f, &identity_star_f, &less_f, &greater_f,
- &prog_string, &cobj_hash, &lazy_streams_binding,
+ &identity_f, &identity_star_f, &less_f, &greater_f, &gt_f,
+ &prog_string, &cobj_hash, &lazy_streams_binding, &hist_succ_f,
convert(val *, 0));
nil_string = lit("nil");
@@ -14126,9 +14142,12 @@ static void obj_init(void)
list_f = func_n0v(listv);
less_f = func_n2(less);
greater_f = func_n2(greater);
+ gt_f = func_n2(gt);
prog_string = string(progname);
cobj_hash = make_hash(hash_weak_none, nil);
+
+ hist_succ_f = func_n2(hist_succ);
}
static val simple_qref_args_p(val args, val pos)