summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--ChangeLog9
-rw-r--r--lib.c33
-rw-r--r--lib.h1
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 <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.
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);