~ chicken-core (chicken-5) c8af768ebffa0191cda4890addbfd2de7184423d
commit c8af768ebffa0191cda4890addbfd2de7184423d
Author: Peter Bex <peter@more-magic.net>
AuthorDate: Mon Jun 1 20:23:49 2015 +0200
Commit: Evan Hanson <evhan@foldling.org>
CommitDate: Fri Jun 12 16:32:24 2015 +1200
Allow for zero or single-argument numeric comparisons, as an extension to R5RS and for consistency with existing type specializations
Signed-off-by: Evan Hanson <evhan@foldling.org>
diff --git a/runtime.c b/runtime.c
index 4583876b..1200183b 100644
--- a/runtime.c
+++ b/runtime.c
@@ -9625,15 +9625,18 @@ C_regparm C_word C_fcall C_i_bignum_cmp(C_word x, C_word y)
void C_ccall C_nequalp(C_word c, C_word closure, C_word k, ...)
{
- C_word x, y, result;
+ C_word x, y, result = C_SCHEME_TRUE;
va_list v;
- if (c < 4) C_bad_argc_2(c, 4, closure);
-
- c -= 2;
+ c -= 2;
+ if (c == 0) C_kontinue(k, result);
va_start(v, k);
x = va_arg(v, C_word);
+
+ if (c == 1 && !C_truep(C_i_numberp(x)))
+ barf(C_BAD_ARGUMENT_TYPE_NO_NUMBER_ERROR, "=", x);
+
while(--c) {
y = va_arg(v, C_word);
result = C_i_nequalp(x, y);
@@ -9662,15 +9665,18 @@ C_regparm C_word C_fcall C_i_integer_equalp(C_word x, C_word y)
void C_ccall C_greaterp(C_word c, C_word closure, C_word k, ...)
{
- C_word x, y, result;
+ C_word x, y, result = C_SCHEME_TRUE;
va_list v;
- if (c < 4) C_bad_argc_2(c, 4, closure);
-
c -= 2;
+ if (c == 0) C_kontinue(k, result);
va_start(v, k);
x = va_arg(v, C_word);
+
+ if (c == 1 && !C_truep(C_i_numberp(x)))
+ barf(C_BAD_ARGUMENT_TYPE_NO_NUMBER_ERROR, ">", x);
+
while(--c) {
y = va_arg(v, C_word);
result = C_i_greaterp(x, y);
@@ -9705,15 +9711,17 @@ C_regparm C_word C_fcall C_i_integer_greaterp(C_word x, C_word y)
void C_ccall C_lessp(C_word c, C_word closure, C_word k, ...)
{
- C_word x, y, result;
+ C_word x, y, result = C_SCHEME_TRUE;
va_list v;
- if (c < 4) C_bad_argc_2(c, 4, closure);
-
c -= 2;
+ if (c == 0) C_kontinue(k, result);
va_start(v, k);
x = va_arg(v, C_word);
+ if (c == 1 && !C_truep(C_i_numberp(x)))
+ barf(C_BAD_ARGUMENT_TYPE_NO_NUMBER_ERROR, "<", x);
+
while(--c) {
y = va_arg(v, C_word);
result = C_i_lessp(x, y);
@@ -9748,15 +9756,18 @@ C_regparm C_word C_fcall C_i_integer_lessp(C_word x, C_word y)
void C_ccall C_greater_or_equal_p(C_word c, C_word closure, C_word k, ...)
{
- C_word x, y, result;
+ C_word x, y, result = C_SCHEME_TRUE;
va_list v;
- if (c < 4) C_bad_argc_2(c, 4, closure);
-
c -= 2;
+ if (c == 0) C_kontinue(k, result);
va_start(v, k);
x = va_arg(v, C_word);
+
+ if (c == 1 && !C_truep(C_i_numberp(x)))
+ barf(C_BAD_ARGUMENT_TYPE_NO_NUMBER_ERROR, ">=", x);
+
while(--c) {
y = va_arg(v, C_word);
result = C_i_greater_or_equalp(x, y);
@@ -9793,15 +9804,18 @@ C_regparm C_word C_fcall C_i_integer_greater_or_equalp(C_word x, C_word y)
void C_ccall C_less_or_equal_p(C_word c, C_word closure, C_word k, ...)
{
- C_word x, y, result;
+ C_word x, y, result = C_SCHEME_TRUE;
va_list v;
- if (c < 4) C_bad_argc_2(c, 4, closure);
-
c -= 2;
+ if (c == 0) C_kontinue(k, result);
va_start(v, k);
x = va_arg(v, C_word);
+
+ if (c == 1 && !C_truep(C_i_numberp(x)))
+ barf(C_BAD_ARGUMENT_TYPE_NO_NUMBER_ERROR, "<=", x);
+
while(--c) {
y = va_arg(v, C_word);
result = C_i_less_or_equalp(x, y);
Trap