~ 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