diff options
-rw-r--r-- | ChangeLog | 9 | ||||
-rw-r--r-- | lib.c | 33 | ||||
-rw-r--r-- | lib.h | 1 |
3 files changed, 23 insertions, 20 deletions
@@ -1,3 +1,12 @@ +2015-06-24 Kaz Kylheku <kaz@kylheku.com> + + Refactoring n-ary functions to use a single helper. + + * lib.c (nary_op): New function. + (plusv, mulv, logandv, logiorv): Use nary_op. + + * lib.h (nary_op): Declared. + 2015-06-23 Kaz Kylheku <kaz@kylheku.com> Hash subset testing. @@ -2074,13 +2074,18 @@ val numberp(val num) } } +val nary_op(val (*cfunc)(val, val), val args, val emptyval) +{ + if (!args) + return emptyval; + else if (!cdr(args)) + return car(args); + return reduce_left(func_n2(cfunc), cdr(args), car(args), nil); +} + val plusv(val nlist) { - if (!nlist) - return num(0); - else if (!cdr(nlist)) - return car(nlist); - return reduce_left(func_n2(plus), cdr(nlist), car(nlist), nil); + return nary_op(plus, nlist, zero); } val minusv(val minuend, val nlist) @@ -2092,29 +2097,17 @@ val minusv(val minuend, val nlist) val mulv(val nlist) { - if (!nlist) - return one; - else if (!cdr(nlist)) - return car(nlist); - return reduce_left(func_n2(mul), cdr(nlist), car(nlist), nil); + return nary_op(mul, nlist, one); } val logandv(val nlist) { - if (!nlist) - return negone; - else if (!cdr(nlist)) - return car(nlist); - return reduce_left(func_n2(logand), cdr(nlist), car(nlist), nil); + return nary_op(logand, nlist, negone); } val logiorv(val nlist) { - if (!nlist) - return zero; - else if (!cdr(nlist)) - return car(nlist); - return reduce_left(func_n2(logior), cdr(nlist), car(nlist), nil); + return nary_op(logior, nlist, zero); } val gtv(val first, val rest) @@ -536,6 +536,7 @@ val bignump(val num); val floatp(val num); val integerp(val num); val numberp(val num); +val nary_op(val (*cfunc)(val, val), val args, val emptyval); val plus(val anum, val bnum); val plusv(val nlist); val minus(val anum, val bnum); |