summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndy Wingo <wingo@pobox.com>2009-09-06 14:15:28 +0200
committerAndy Wingo <wingo@pobox.com>2009-12-03 15:33:09 +0100
commit8ccd24f7bb523055dc2d75d923ff02c7b121aedc (patch)
treeda1852053bad7838347b78d51f5d7517f442b8b6
parentb04ab0c624621acdd985861f1fb9f2c3d4f6275f (diff)
downloadguile-8ccd24f7bb523055dc2d75d923ff02c7b121aedc.tar.gz
+ is not an asubr
* libguile/numbers.h: * libguile/numbers.c (scm_i_sum): Rework so that scm_sum is just a normal function. Its generic is actually provided by scm_i_sum, a gsubr with rest args. In that way, + is no longer an asubr.
-rw-r--r--libguile/numbers.c22
-rw-r--r--libguile/numbers.h1
2 files changed, 19 insertions, 4 deletions
diff --git a/libguile/numbers.c b/libguile/numbers.c
index f144d0cb3..6fc4c2abf 100644
--- a/libguile/numbers.c
+++ b/libguile/numbers.c
@@ -3991,10 +3991,24 @@ scm_min (SCM x, SCM y)
}
-SCM_GPROC1 (s_sum, "+", scm_tc7_asubr, scm_sum, g_sum);
-/* "Return the sum of all parameter values. Return 0 if called without\n"
- * "any parameters."
- */
+SCM_PRIMITIVE_GENERIC (scm_i_sum, "+", 0, 2, 1,
+ (SCM x, SCM y, SCM rest),
+ "Return the sum of all parameter values. Return 0 if called without\n"
+ "any parameters." )
+#define FUNC_NAME s_scm_i_sum
+{
+ while (!scm_is_null (rest))
+ { x = scm_sum (x, y);
+ y = scm_car (rest);
+ rest = scm_cdr (rest);
+ }
+ return scm_sum (x, y);
+}
+#undef FUNC_NAME
+
+#define s_sum s_scm_i_sum
+#define g_sum g_scm_i_sum
+
SCM
scm_sum (SCM x, SCM y)
{
diff --git a/libguile/numbers.h b/libguile/numbers.h
index 31eba9472..1a8523f4a 100644
--- a/libguile/numbers.h
+++ b/libguile/numbers.h
@@ -238,6 +238,7 @@ SCM_API SCM scm_negative_p (SCM x);
SCM_API SCM scm_max (SCM x, SCM y);
SCM_API SCM scm_min (SCM x, SCM y);
SCM_API SCM scm_sum (SCM x, SCM y);
+SCM_INTERNAL SCM scm_i_sum (SCM x, SCM y, SCM rest);
SCM_API SCM scm_oneplus (SCM x);
SCM_API SCM scm_difference (SCM x, SCM y);
SCM_API SCM scm_oneminus (SCM x);