summaryrefslogtreecommitdiffstats
path: root/lib.c
diff options
context:
space:
mode:
authorKaz Kylheku <kaz@kylheku.com>2016-01-14 06:15:27 -0800
committerKaz Kylheku <kaz@kylheku.com>2016-01-14 06:15:27 -0800
commitdf8eacf8034abab8c942fce1ea3834e8af767b42 (patch)
tree92a9ea61057d536cc86d878bf983fb4f57a23a1a /lib.c
parentef12675137716636077e08a6b5008de638c6d06f (diff)
downloadtxr-df8eacf8034abab8c942fce1ea3834e8af767b42.tar.gz
txr-df8eacf8034abab8c942fce1ea3834e8af767b42.tar.bz2
txr-df8eacf8034abab8c942fce1ea3834e8af767b42.zip
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.
Diffstat (limited to 'lib.c')
-rw-r--r--lib.c16
1 files changed, 13 insertions, 3 deletions
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)