summaryrefslogtreecommitdiffstats
path: root/lib.c
diff options
context:
space:
mode:
authorKaz Kylheku <kaz@kylheku.com>2015-07-24 05:11:31 -0700
committerKaz Kylheku <kaz@kylheku.com>2015-07-24 05:11:31 -0700
commit2f654aa0a794581bb857c38e99e0abb185c53d52 (patch)
tree51007fa2671f092c2d89c42ed6797d913907693b /lib.c
parente65fc7cc213436bba321a9b616bb77874b2a789a (diff)
downloadtxr-2f654aa0a794581bb857c38e99e0abb185c53d52.tar.gz
txr-2f654aa0a794581bb857c38e99e0abb185c53d52.tar.bz2
txr-2f654aa0a794581bb857c38e99e0abb185c53d52.zip
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.
Diffstat (limited to 'lib.c')
-rw-r--r--lib.c33
1 files changed, 13 insertions, 20 deletions
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)