summaryrefslogtreecommitdiffstats
path: root/lib.c
diff options
context:
space:
mode:
authorKaz Kylheku <kaz@kylheku.com>2012-08-29 18:34:25 -0700
committerKaz Kylheku <kaz@kylheku.com>2012-08-29 18:34:25 -0700
commitdd9f7f30e879123e57a32492c7c82d9d2b361678 (patch)
tree2d956b4b07932cbdf3486619263269c111ff51f7 /lib.c
parentc3700b0be6c78154e811a3225128efec098efcaf (diff)
downloadtxr-dd9f7f30e879123e57a32492c7c82d9d2b361678.tar.gz
txr-dd9f7f30e879123e57a32492c7c82d9d2b361678.tar.bz2
txr-dd9f7f30e879123e57a32492c7c82d9d2b361678.zip
* eval.c (mapcarv): Changed to external linkage.
* eval.h (mapcarv): Declaration added. (eval_init): New intrinsic multi-sort registered. * lib.c (multi_sort_less): New static function. (multi_sort): New function. * lib.h (multi_sort): Declared. * txr.1: stub section added.
Diffstat (limited to 'lib.c')
-rw-r--r--lib.c31
1 files changed, 31 insertions, 0 deletions
diff --git a/lib.c b/lib.c
index acaccf72..7c15a864 100644
--- a/lib.c
+++ b/lib.c
@@ -3994,6 +3994,37 @@ val sort(val seq, val lessfun, val keyfun)
return seq;
}
+static val multi_sort_less(val funcs, val llist, val rlist)
+{
+ val less = nil;
+
+ while (funcs) {
+ val func = pop(&funcs);
+ val left = pop(&llist);
+ val right = pop(&rlist);
+
+ if (funcall2(func, left, right)) {
+ less = t;
+ break;
+ }
+
+ if (funcall2(func, right, left))
+ break;
+ }
+
+ return less;
+}
+
+val multi_sort(val funcs, val lists)
+{
+ val lol = mapcarv(func_n0v(identity), lists);
+
+ if (functionp(funcs))
+ funcs = cons(funcs, nil);
+
+ return sort_list(lol, func_f2(funcs, multi_sort_less), identity_f);
+}
+
val find(val item, val list, val testfun, val keyfun)
{
if (!keyfun)