diff options
author | Kaz Kylheku <kaz@kylheku.com> | 2016-01-14 06:15:27 -0800 |
---|---|---|
committer | Kaz Kylheku <kaz@kylheku.com> | 2016-01-14 06:15:27 -0800 |
commit | df8eacf8034abab8c942fce1ea3834e8af767b42 (patch) | |
tree | 92a9ea61057d536cc86d878bf983fb4f57a23a1a /lib.c | |
parent | ef12675137716636077e08a6b5008de638c6d06f (diff) | |
download | txr-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.c | 16 |
1 files changed, 13 insertions, 3 deletions
@@ -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) |