From 2f654aa0a794581bb857c38e99e0abb185c53d52 Mon Sep 17 00:00:00 2001 From: Kaz Kylheku Date: Fri, 24 Jul 2015 05:11:31 -0700 Subject: 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. --- ChangeLog | 9 +++++++++ lib.c | 33 +++++++++++++-------------------- lib.h | 1 + 3 files changed, 23 insertions(+), 20 deletions(-) diff --git a/ChangeLog b/ChangeLog index ec5a5d2d..99614ffb 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,12 @@ +2015-06-24 Kaz Kylheku + + 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 Hash subset testing. diff --git a/lib.c b/lib.c index 0e8a15e1..6e9e2d8e 100644 --- a/lib.c +++ b/lib.c @@ -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) diff --git a/lib.h b/lib.h index 66cc89da..cd78205e 100644 --- a/lib.h +++ b/lib.h @@ -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); -- cgit v1.2.3