: class-of ( obj -- name )
[
- [ fixnum? ] [ drop "fixnum" ]
- [ bignum? ] [ drop "bignum" ]
- [ ratio? ] [ drop "ratio" ]
- [ float? ] [ drop "float" ]
- [ cons? ] [ drop "cons" ]
- [ word? ] [ drop "word" ]
- [ f = ] [ drop "f" ]
- [ t = ] [ drop "t" ]
- [ vector? ] [ drop "vector" ]
- [ string? ] [ drop "string" ]
- [ sbuf? ] [ drop "sbuf" ]
- [ handle? ] [ drop "handle" ]
- [ drop t ] [ drop "unknown" ]
+ [ fixnum? ] [ drop "fixnum" ]
+ [ bignum? ] [ drop "bignum" ]
+ [ ratio? ] [ drop "ratio" ]
+ [ float? ] [ drop "float" ]
+ [ complex? ] [ drop "complex" ]
+ [ cons? ] [ drop "cons" ]
+ [ word? ] [ drop "word" ]
+ [ f = ] [ drop "f" ]
+ [ t = ] [ drop "t" ]
+ [ vector? ] [ drop "vector" ]
+ [ string? ] [ drop "string" ]
+ [ sbuf? ] [ drop "sbuf" ]
+ [ handle? ] [ drop "handle" ]
+ [ drop t ] [ drop "unknown" ]
] cond ;
: toplevel ( -- )
return (FLOAT*)UNTAG(divfloat(r->numerator,r->denominator));
}
-void primitive_numberp(void)
+bool realp(CELL tagged)
{
- check_non_empty(env.dt);
-
- switch(type_of(env.dt))
+ switch(type_of(tagged))
{
case FIXNUM_TYPE:
case BIGNUM_TYPE:
case RATIO_TYPE:
case FLOAT_TYPE:
- env.dt = T;
+ return true;
break;
default:
- env.dt = F;
+ return false;
break;
}
}
+bool numberp(CELL tagged)
+{
+ return realp(tagged) || type_of(tagged) == COMPLEX_TYPE;
+}
+
+void primitive_numberp(void)
+{
+ check_non_empty(env.dt);
+ env.dt = tag_boolean(numberp(env.dt));
+}
+
+bool zerop(CELL tagged)
+{
+ switch(type_of(tagged))
+ {
+ case FIXNUM_TYPE:
+ return tagged == 0;
+ case BIGNUM_TYPE:
+ return ((BIGNUM*)UNTAG(tagged))->n == 0;
+ case FLOAT_TYPE:
+ return ((FLOAT*)UNTAG(tagged))->n == 0.0;
+ case RATIO_TYPE:
+ return false;
+ default:
+ critical_error("Bad parameter to zerop",tagged);
+ return false; /* Can't happen */
+ }
+}
+
CELL to_integer(CELL tagged)
{
RATIO* r;
r = (RATIO*)UNTAG(tagged);
return divint(r->numerator,r->denominator);
default:
- type_error(FIXNUM_TYPE,tagged);
+ type_error(INTEGER_TYPE,tagged);
return NULL; /* can't happen */
}
}
return OP##_fixnum(x,y); \
case RATIO_TYPE: \
if(integerOnly) \
- return OP(x,to_integer(y)); \
+ { \
+ type_error(FIXNUM_TYPE,y); \
+ return F; \
+ } \
else \
return OP##_ratio((CELL)fixnum_to_ratio(x),y); \
+ case COMPLEX_TYPE: \
+ if(integerOnly) \
+ { \
+ type_error(FIXNUM_TYPE,y); \
+ return F; \
+ } \
+ else \
+ return OP##_complex((CELL)complex(x,tag_fixnum(0)),y); \
case BIGNUM_TYPE: \
return OP##_bignum((CELL)fixnum_to_bignum(x),y); \
case FLOAT_TYPE: \
if(integerOnly) \
- return OP(x,to_integer(y)); \
+ { \
+ type_error(FIXNUM_TYPE,y); \
+ return F; \
+ } \
else \
return OP##_float((CELL)fixnum_to_float(x),y); \
default: \
} \
\
case RATIO_TYPE: \
+\
+ if(integerOnly) \
+ { \
+ type_error(FIXNUM_TYPE,x); \
+ return F; \
+ } \
\
switch(type_of(y)) \
{ \
case FIXNUM_TYPE: \
- if(integerOnly) \
- return OP(to_integer(x),y); \
- else \
- return OP##_ratio(x,(CELL)fixnum_to_ratio(y)); \
+ return OP##_ratio(x,(CELL)fixnum_to_ratio(y)); \
case RATIO_TYPE: \
- if(integerOnly) \
- return OP(to_integer(x),to_integer(y)); \
- else \
- return OP##_ratio(x,y); \
+ return OP##_ratio(x,y); \
+ case COMPLEX_TYPE: \
+ return OP##_complex((CELL)complex(x,tag_fixnum(0)),y); \
case BIGNUM_TYPE: \
- if(integerOnly) \
- return OP(to_integer(x),y); \
- else \
- return OP##_ratio(x,(CELL)bignum_to_ratio(y)); \
+ return OP##_ratio(x,(CELL)bignum_to_ratio(y)); \
case FLOAT_TYPE: \
- if(integerOnly) \
- return OP(to_integer(x),to_integer(y)); \
+ return OP##_float((CELL)ratio_to_float(x),y); \
+ default: \
+ if(anytype) \
+ return OP##_anytype(x,y); \
else \
- return OP##_float((CELL)ratio_to_float(x),y); \
+ type_error(FIXNUM_TYPE,y); \
+ return F; \
+ } \
+\
+ case COMPLEX_TYPE: \
+\
+ if(integerOnly) \
+ { \
+ type_error(FIXNUM_TYPE,x); \
+ return F; \
+ } \
+\
+ switch(type_of(y)) \
+ { \
+ case FIXNUM_TYPE: \
+ return OP##_complex(x,(CELL)complex(y,tag_fixnum(0))); \
+ case RATIO_TYPE: \
+ return OP##_complex(x,(CELL)complex(y,tag_fixnum(0))); \
+ case COMPLEX_TYPE: \
+ return OP##_complex(x,y); \
+ case BIGNUM_TYPE: \
+ return OP##_complex(x,(CELL)complex(y,tag_fixnum(0))); \
+ case FLOAT_TYPE: \
+ return OP##_complex(x,(CELL)complex(y,tag_fixnum(0))); \
default: \
if(anytype) \
return OP##_anytype(x,y); \
return OP##_bignum(x,(CELL)fixnum_to_bignum(y)); \
case RATIO_TYPE: \
if(integerOnly) \
- return OP(x,to_integer(y)); \
+ { \
+ type_error(BIGNUM_TYPE,y); \
+ return F; \
+ } \
else \
return OP##_ratio((CELL)bignum_to_ratio(x),y); \
+ case COMPLEX_TYPE: \
+ if(integerOnly) \
+ { \
+ type_error(BIGNUM_TYPE,y); \
+ return F; \
+ } \
+ else \
+ return OP##_complex((CELL)complex(x,tag_fixnum(0)),y); \
case BIGNUM_TYPE: \
return OP##_bignum(x,y); \
case FLOAT_TYPE: \
if(integerOnly) \
- return OP(x,to_integer(y)); \
+ { \
+ type_error(BIGNUM_TYPE,y); \
+ return F; \
+ } \
else \
return OP##_float((CELL)bignum_to_float(x),y); \
default: \
} \
\
case FLOAT_TYPE: \
- \
+\
+ if(integerOnly) \
+ { \
+ type_error(FIXNUM_TYPE,x); \
+ return F; \
+ } \
+\
switch(type_of(y)) \
{ \
case FIXNUM_TYPE: \
- if(integerOnly) \
- return OP(to_integer(x),y); \
- else \
- return OP##_float(x,(CELL)fixnum_to_float(y)); \
+ return OP##_float(x,(CELL)fixnum_to_float(y)); \
case RATIO_TYPE: \
- if(integerOnly) \
- return OP(x,to_integer(y)); \
- else \
- return OP##_float(x,(CELL)ratio_to_float(y)); \
+ return OP##_float(x,(CELL)ratio_to_float(y)); \
+ case COMPLEX_TYPE: \
+ return OP##_complex((CELL)complex(x,tag_fixnum(0)),y); \
case BIGNUM_TYPE: \
- if(integerOnly) \
- return OP(to_integer(x),y); \
- else \
- return OP##_float(x,(CELL)bignum_to_float(y)); \
+ return OP##_float(x,(CELL)bignum_to_float(y)); \
case FLOAT_TYPE: \
- if(integerOnly) \
- return OP(to_integer(x),to_integer(y)); \
- else \
- return OP##_float(x,y); \
+ return OP##_float(x,y); \
default: \
- if(anytype) \
- return OP##_anytype(x,y); \
- else \
- type_error(FLOAT_TYPE,y); \
+ type_error(FLOAT_TYPE,y); \
return F; \
} \
\
env.dt = OP(x,y); \
}
+bool realp(CELL tagged);
+bool numberp(CELL tagged);
void primitive_numberp(void);
+bool zerop(CELL tagged);
+
FIXNUM to_fixnum(CELL tagged);
void primitive_to_fixnum(void);
BIGNUM* to_bignum(CELL tagged);