diff options
-rw-r--r-- | ChangeLog | 14 | ||||
-rw-r--r-- | eval.c | 3 | ||||
-rw-r--r-- | eval.h | 1 | ||||
-rw-r--r-- | lib.c | 31 | ||||
-rw-r--r-- | lib.h | 1 | ||||
-rw-r--r-- | txr.1 | 2 |
6 files changed, 51 insertions, 1 deletions
@@ -1,3 +1,17 @@ +2012-08-29 Kaz Kylheku <kaz@kylheku.com> + + * 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. + 2012-05-18 Kaz Kylheku <kaz@kylheku.com> * eval.c (eval_init): Registered open-command and open-process @@ -1741,7 +1741,7 @@ val expand(val form) } } -static val mapcarv(val fun, val list_of_lists) +val mapcarv(val fun, val list_of_lists) { if (!cdr(list_of_lists)) { return mapcar(fun, car(list_of_lists)); @@ -2381,6 +2381,7 @@ void eval_init(void) reg_fun(intern(lit("merge"), user_package), func_n4o(merge, 2)); reg_fun(intern(lit("sort"), user_package), func_n3o(sort, 2)); reg_fun(intern(lit("find"), user_package), func_n4o(find, 2)); + reg_fun(intern(lit("multi-sort"), user_package), func_n2(multi_sort)); reg_fun(intern(lit("find-if"), user_package), func_n3o(find_if, 2)); reg_fun(intern(lit("set-diff"), user_package), func_n4o(set_diff, 2)); @@ -39,5 +39,6 @@ val eval_progn(val forms, val env, val ctx_form); val eval(val form, val env, val ctx_form); val expand(val form); val bindable(val obj); +val mapcarv(val fun, val list_of_lists); void eval_init(void); @@ -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) @@ -635,6 +635,7 @@ val mapcon(val fun, val list); val mappend(val fun, val list); val merge(val list1, val list2, val lessfun, val keyfun); val sort(val seq, val lessfun, val keyfun); +val multi_sort(val funcs, val lists); val find(val list, val key, val testfun, val keyfun); val find_if(val pred, val list, val key); val set_diff(val list1, val list2, val testfun, val keyfun); @@ -7635,6 +7635,8 @@ Examples: .SS Function sort +.SS Function multi-sort + .SS Functions find and find-if .SS Function set-diff |