diff --git a/include/chibi/sexp.h b/include/chibi/sexp.h index ac8db259..77728fa0 100755 --- a/include/chibi/sexp.h +++ b/include/chibi/sexp.h @@ -656,10 +656,20 @@ SEXP_API sexp sexp_make_unsigned_integer(sexp ctx, sexp_luint_t x); #if SEXP_USE_FLONUMS #define sexp_fixnum_to_flonum(ctx, x) (sexp_make_flonum(ctx, sexp_unbox_fixnum(x))) -#define sexp_numberp(x) (sexp_exact_integerp(x) || sexp_flonump(x)) +#if SEXP_USE_RATIOS +#define sexp_realp(x) (sexp_exact_integerp(x) || sexp_flonump(x)) +#else +#define sexp_realp(x) (sexp_exact_integerp(x) || sexp_flonump(x) || sexp_ratiop(x)) +#endif #else #define sexp_fixnum_to_flonum(ctx, x) (x) -#define sexp_numberp(x) sexp_exact_integerp(x) +#define sexp_realp(x) sexp_exact_integerp(x) +#endif + +#if SEXP_USE_COMPLEX +#define sexp_numberp(x) (sexp_realp(x) || sexp_complexp(x)) +#else +#define sexp_numberp(x) (sexp_realp(x)) #endif #define sexp_exact_negativep(x) (sexp_fixnump(x) ? (sexp_unbox_fixnum(x) < 0) \ diff --git a/sexp.c b/sexp.c index 03bf3246..597519af 100644 --- a/sexp.c +++ b/sexp.c @@ -2305,14 +2305,19 @@ sexp sexp_read_raw (sexp ctx, sexp in) { } } else { sexp_push_char(ctx, c2, in); - res = sexp_read_symbol(ctx, in, c1, 1); + res = sexp_read_symbol(ctx, in, c1, 0); #if SEXP_USE_INFINITIES - if (res == sexp_intern(ctx, "+inf.0", -1)) - res = sexp_make_flonum(ctx, sexp_pos_infinity); - else if (res == sexp_intern(ctx, "-inf.0", -1)) - res = sexp_make_flonum(ctx, sexp_neg_infinity); - else if (res == sexp_intern(ctx, "+nan.0", -1)) - res = sexp_make_flonum(ctx, sexp_nan); + if (sexp_stringp(res)) { + str = sexp_string_data(res); + if (strcasecmp(str, "+inf.0") == 0) + res = sexp_make_flonum(ctx, sexp_pos_infinity); + else if (strcasecmp(str, "-inf.0") == 0) + res = sexp_make_flonum(ctx, sexp_neg_infinity); + else if (strcasecmp(str, "+nan.0") == 0) + res = sexp_make_flonum(ctx, sexp_nan); + else + res = sexp_intern(ctx, str, sexp_string_length(res)); + } #endif #if SEXP_USE_COMPLEX if (res == sexp_intern(ctx, "+i", -1))