From df8eacf8034abab8c942fce1ea3834e8af767b42 Mon Sep 17 00:00:00 2001 From: Kaz Kylheku Date: Thu, 14 Jan 2016 06:15:27 -0800 Subject: Improve n-ary minus like newly added division. * lib.c (minusv): Avoid reduce_left overhead in common two-argument case, and just call binary minus function directly. --- lib.c | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) (limited to 'lib.c') diff --git a/lib.c b/lib.c index 02bccc1f..437f8716 100644 --- a/lib.c +++ b/lib.c @@ -2647,9 +2647,19 @@ val plusv(struct args *nlist) val minusv(val minuend, struct args *nlist) { - if (args_more(nlist, 0)) - return reduce_left(func_n2(minus), args_get_list(nlist), minuend, nil); - return neg(minuend); + cnum index = 0; + val fi; + + if (!args_more(nlist, 0)) + return neg(minuend); + + fi = args_get(nlist, &index); + + if (!args_more(nlist, 0)) + return minus(minuend, fi); + + return reduce_left(func_n2(minus), args_get_list(nlist), + minus(minuend, fi), nil); } val mulv(struct args *nlist) -- cgit v1.2.3