3 BIGNUM* fixnum_to_bignum(CELL n);
4 RATIO* fixnum_to_ratio(CELL n);
5 FLOAT* fixnum_to_float(CELL n);
6 FIXNUM bignum_to_fixnum(CELL tagged);
7 RATIO* bignum_to_ratio(CELL n);
8 FLOAT* bignum_to_float(CELL n);
9 FLOAT* ratio_to_float(CELL n);
11 #define CELL_TO_INTEGER(result) \
12 FIXNUM _result = (result); \
13 if(_result < FIXNUM_MIN || _result > FIXNUM_MAX) \
14 return tag_object(fixnum_to_bignum(_result)); \
16 return tag_fixnum(_result);
18 #define BIGNUM_2_TO_INTEGER(result) \
19 BIGNUM_2 _result = (result); \
20 if(_result < FIXNUM_MIN || _result > FIXNUM_MAX) \
21 return tag_object(bignum(_result)); \
23 return tag_fixnum(_result);
25 #define BINARY_OP(OP,anytype,integerOnly) \
26 CELL OP(CELL x, CELL y) \
35 return OP##_fixnum(x,y); \
38 return OP(x,to_integer(y)); \
40 return OP##_ratio((CELL)fixnum_to_ratio(x),y); \
42 return OP##_bignum((CELL)fixnum_to_bignum(x),y); \
45 return OP(x,to_integer(y)); \
47 return OP##_float((CELL)fixnum_to_float(x),y); \
50 return OP##_anytype(x,y); \
52 type_error(FIXNUM_TYPE,y); \
62 return OP(to_integer(x),y); \
64 return OP##_ratio(x,(CELL)fixnum_to_ratio(y)); \
67 return OP(to_integer(x),to_integer(y)); \
69 return OP##_ratio(x,y); \
72 return OP(to_integer(x),y); \
74 return OP##_ratio(x,(CELL)bignum_to_ratio(y)); \
77 return OP(to_integer(x),to_integer(y)); \
79 return OP##_float((CELL)ratio_to_float(x),y); \
82 return OP##_anytype(x,y); \
84 type_error(FIXNUM_TYPE,y); \
93 return OP##_bignum(x,(CELL)fixnum_to_bignum(y)); \
96 return OP(x,to_integer(y)); \
98 return OP##_ratio((CELL)bignum_to_ratio(x),y); \
100 return OP##_bignum(x,y); \
103 return OP(x,to_integer(y)); \
105 return OP##_float((CELL)bignum_to_float(x),y); \
108 return OP##_anytype(x,y); \
110 type_error(BIGNUM_TYPE,y); \
120 return OP(to_integer(x),y); \
122 return OP##_float(x,(CELL)fixnum_to_float(y)); \
125 return OP(x,to_integer(y)); \
127 return OP##_float(x,(CELL)ratio_to_float(y)); \
130 return OP(to_integer(x),y); \
132 return OP##_float(x,(CELL)bignum_to_float(y)); \
135 return OP(to_integer(x),to_integer(y)); \
137 return OP##_float(x,y); \
140 return OP##_anytype(x,y); \
142 type_error(FLOAT_TYPE,y); \
149 return OP##_anytype(x,y); \
151 type_error(FIXNUM_TYPE,x); \
156 void primitive_##OP(void) \
158 CELL x = dpop(), y = env.dt; \
162 void primitive_numberp(void);
164 FIXNUM to_fixnum(CELL tagged);
165 void primitive_to_fixnum(void);
166 BIGNUM* to_bignum(CELL tagged);
167 void primitive_to_bignum(void);
168 CELL to_integer(CELL tagged);
169 void primitive_to_integer(void);
170 CELL number_eq(CELL x, CELL y);
171 void primitive_number_eq(void);
172 CELL add(CELL x, CELL y);
173 void primitive_add(void);
174 CELL subtract(CELL x, CELL y);
175 void primitive_subtract(void);
176 CELL multiply(CELL x, CELL y);
177 void primitive_multiply(void);
178 CELL divide(CELL x, CELL y);
179 void primitive_divmod(void);
180 CELL divint(CELL x, CELL y);
181 void primitive_divint(void);
182 CELL divfloat(CELL x, CELL y);
183 void primitive_divfloat(void);
184 CELL divide(CELL x, CELL y);
185 void primitive_divide(void);
186 CELL less(CELL x, CELL y);
187 void primitive_less(void);
188 CELL lesseq(CELL x, CELL y);
189 void primitive_lesseq(void);
190 CELL greater(CELL x, CELL y);
191 void primitive_greater(void);
192 CELL greatereq(CELL x, CELL y);
193 void primitive_greatereq(void);
194 CELL mod(CELL x, CELL y);
195 void primitive_mod(void);
196 CELL and(CELL x, CELL y);
197 void primitive_and(void);
198 CELL or(CELL x, CELL y);
199 void primitive_or(void);
200 CELL xor(CELL x, CELL y);
201 void primitive_xor(void);
202 CELL shiftleft(CELL x, CELL y);
203 void primitive_shiftleft(void);
204 CELL shiftright(CELL x, CELL y);
205 void primitive_shiftright(void);