diff options
author | Kaz Kylheku <kaz@kylheku.com> | 2012-08-29 18:34:25 -0700 |
---|---|---|
committer | Kaz Kylheku <kaz@kylheku.com> | 2012-08-29 18:34:25 -0700 |
commit | dd9f7f30e879123e57a32492c7c82d9d2b361678 (patch) | |
tree | 2d956b4b07932cbdf3486619263269c111ff51f7 /lib.c | |
parent | c3700b0be6c78154e811a3225128efec098efcaf (diff) | |
download | txr-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.c | 31 |
1 files changed, 31 insertions, 0 deletions
@@ -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) |