Mercurial > hg > xemacs-beta
annotate src/number.h @ 5462:97ac18bd1fa3
Make sure distinct symbol macros with identical names expand distinctly.
lisp/ChangeLog addition:
2011-04-24 Aidan Kehoe <kehoea@parhasard.net>
* cl-macs.el (symbol-macrolet):
* cl-macs.el (lexical-let):
* cl.el:
* cl.el (cl-macroexpand):
Distinct symbol macros with identical string names should
nonetheless expand to different things; implement this, storing
the symbol's eq-hash in the macro environment, rather than its
string name.
tests/ChangeLog addition:
2011-04-24 Aidan Kehoe <kehoea@parhasard.net>
* automated/lisp-tests.el:
Check that distinct symbol macros with identical string names
expand to different things.
author | Aidan Kehoe <kehoea@parhasard.net> |
---|---|
date | Sun, 24 Apr 2011 09:52:45 +0100 |
parents | c096d8051f89 |
children | 8d29f1c4bb98 |
rev | line source |
---|---|
1983 | 1 /* Definitions of numeric types for XEmacs. |
2 Copyright (C) 2004 Jerry James. | |
3 | |
4 This file is part of XEmacs. | |
5 | |
6 XEmacs is free software; you can redistribute it and/or modify it | |
7 under the terms of the GNU General Public License as published by the | |
8 Free Software Foundation; either version 2, or (at your option) any | |
9 later version. | |
10 | |
11 XEmacs is distributed in the hope that it will be useful, but WITHOUT | |
12 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | |
13 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | |
14 for more details. | |
15 | |
16 You should have received a copy of the GNU General Public License | |
17 along with XEmacs; see the file COPYING. If not, write to | |
5286
7e535575bf6d
More permission consistency.
Stephen J. Turnbull <stephen@xemacs.org>
parents:
5234
diff
changeset
|
18 the Free Software Foundation, Inc., 51 Franklin Street - Fifth Floor, |
5234
53b88477345d
Fix up FSF's Franklin Street address in number.h.
Stephen J. Turnbull <stephen@xemacs.org>
parents:
5125
diff
changeset
|
19 Boston, MA 02110-1301, USA. */ |
1983 | 20 |
21 /* Synched up with: Not in FSF. */ | |
22 | |
23 #ifndef INCLUDED_number_h_ | |
24 #define INCLUDED_number_h_ | |
25 | |
26 /* The following types are always defined in the same manner: | |
27 fixnum = whatever fits in the Lisp_Object type | |
28 integer = union (fixnum, bignum) | |
29 rational = union (integer, ratio) | |
30 float = C double | |
31 floating = union(float, bigfloat) Anybody got a better name? | |
32 real = union (rational, floating) | |
33 number = real (should be union(real, complex) but no complex yet) | |
34 | |
35 It is up to the library-specific code to define the remaining types, | |
36 namely: bignum, ratio, and bigfloat. Not all of these types may be | |
37 available. The top-level configure script should define the symbols | |
38 HAVE_BIGNUM, HAVE_RATIO, and HAVE_BIGFLOAT to indicate which it provides. | |
39 If some type is not defined by the library, this is what happens: | |
40 | |
41 - bignum: bignump(x) is false for all x; any attempt to create a bignum | |
42 causes an error to be raised. | |
43 | |
44 - ratio: we define our own structure consisting of two Lisp_Objects, which | |
45 are presumed to be integers (i.e., either fixnums or bignums). We do our | |
46 own GCD calculation, which is bound to be slow, to keep the ratios | |
47 reduced to canonical form. (FIXME: Not yet implemented.) | |
48 | |
49 - bigfloat: bigfloat(x) is false for all x; any attempt to create a | |
50 bigfloat causes an error to be raised. | |
51 | |
52 We (provide) the following symbols, so that Lisp code has some hope of | |
53 using this correctly: | |
54 | |
55 - (provide 'bignum) if HAVE_BIGNUM | |
56 - (provde 'ratio) if HAVE_RATIO | |
57 - (provide 'bigfloat) if HAVE_BIGFLOAT | |
58 */ | |
59 | |
60 /* Load the library definitions */ | |
61 #ifdef WITH_GMP | |
62 #include "number-gmp.h" | |
63 #endif | |
64 #ifdef WITH_MP | |
65 #include "number-mp.h" | |
66 #endif | |
67 | |
68 | |
69 /********************************* Bignums **********************************/ | |
70 #ifdef HAVE_BIGNUM | |
71 | |
72 struct Lisp_Bignum | |
73 { | |
5120
d1247f3cc363
latest work on lisp-object workspace;
Ben Wing <ben@xemacs.org>
parents:
5118
diff
changeset
|
74 FROB_BLOCK_LISP_OBJECT_HEADER lheader; |
1983 | 75 bignum data; |
76 }; | |
77 typedef struct Lisp_Bignum Lisp_Bignum; | |
78 | |
5118
e0db3c197671
merge up to latest default branch, doesn't compile yet
Ben Wing <ben@xemacs.org>
parents:
4678
diff
changeset
|
79 DECLARE_LISP_OBJECT (bignum, Lisp_Bignum); |
1983 | 80 #define XBIGNUM(x) XRECORD (x, bignum, Lisp_Bignum) |
81 #define wrap_bignum(p) wrap_record (p, bignum) | |
82 #define BIGNUMP(x) RECORDP (x, bignum) | |
83 #define CHECK_BIGNUM(x) CHECK_RECORD (x, bignum) | |
84 #define CONCHECK_BIGNUM(x) CONCHECK_RECORD (x, bignum) | |
85 | |
86 #define bignum_data(b) (b)->data | |
87 #define XBIGNUM_DATA(x) bignum_data (XBIGNUM (x)) | |
88 | |
89 #define BIGNUM_ARITH_RETURN(b,op) do \ | |
90 { \ | |
91 Lisp_Object retval = make_bignum (0); \ | |
92 bignum_##op (XBIGNUM_DATA (retval), XBIGNUM_DATA (b)); \ | |
93 return Fcanonicalize_number (retval); \ | |
94 } while (0) | |
95 | |
96 #define BIGNUM_ARITH_RETURN1(b,op,arg) do \ | |
97 { \ | |
98 Lisp_Object retval = make_bignum(0); \ | |
99 bignum_##op (XBIGNUM_DATA (retval), XBIGNUM_DATA (b), arg); \ | |
100 return Fcanonicalize_number (retval); \ | |
101 } while (0) | |
102 | |
3391 | 103 #if SIZEOF_EMACS_INT == SIZEOF_LONG |
104 # define bignum_fits_emacs_int_p(b) bignum_fits_long_p(b) | |
105 # define bignum_to_emacs_int(b) bignum_to_long(b) | |
106 #elif SIZEOF_EMACS_INT == SIZEOF_INT | |
107 # define bignum_fits_emacs_int_p(b) bignum_fits_int_p(b) | |
108 # define bignum_to_emacs_int(b) bignum_to_int(b) | |
109 #else | |
110 # error Bignums currently do not work with long long Emacs integers. | |
111 #endif | |
112 | |
1983 | 113 extern Lisp_Object make_bignum (long); |
114 extern Lisp_Object make_bignum_bg (bignum); | |
115 extern bignum scratch_bignum, scratch_bignum2; | |
116 | |
117 #else /* !HAVE_BIGNUM */ | |
118 | |
119 #define BIGNUMP(x) 0 | |
120 #define CHECK_BIGNUM(x) dead_wrong_type_argument (Qbignump, x) | |
121 #define CONCHECK_BIGNUM(x) dead_wrong_type_argument (Qbignump, x) | |
122 typedef void bignum; | |
123 #define make_bignum(l) This XEmacs does not support bignums | |
124 #define make_bignum_bg(b) This XEmacs does not support bignums | |
125 | |
126 #endif /* HAVE_BIGNUM */ | |
127 | |
2092 | 128 extern Lisp_Object Qbignump; |
1983 | 129 EXFUN (Fbignump, 1); |
130 | |
131 | |
132 /********************************* Integers *********************************/ | |
4932 | 133 /* Qintegerp in lisp.h */ |
1983 | 134 #define INTEGERP(x) (INTP(x) || BIGNUMP(x)) |
135 #define CHECK_INTEGER(x) do { \ | |
136 if (!INTEGERP (x)) \ | |
137 dead_wrong_type_argument (Qintegerp, x); \ | |
138 } while (0) | |
139 #define CONCHECK_INTEGER(x) do { \ | |
140 if (!INTEGERP (x)) \ | |
141 x = wrong_type_argument (Qintegerp, x); \ | |
142 } while (0) | |
143 | |
144 #ifdef HAVE_BIGNUM | |
145 #define make_integer(x) \ | |
146 (NUMBER_FITS_IN_AN_EMACS_INT (x) ? make_int (x) : make_bignum (x)) | |
147 #else | |
148 #define make_integer(x) make_int (x) | |
149 #endif | |
150 | |
151 extern Fixnum Vmost_negative_fixnum, Vmost_positive_fixnum; | |
152 EXFUN (Fintegerp, 1); | |
153 EXFUN (Fevenp, 1); | |
154 EXFUN (Foddp, 1); | |
155 | |
5307
c096d8051f89
Have NATNUMP give t for positive bignums; check limits appropriately.
Aidan Kehoe <kehoea@parhasard.net>
parents:
5286
diff
changeset
|
156 /* There are varying mathematical definitions of what a natural number is, |
c096d8051f89
Have NATNUMP give t for positive bignums; check limits appropriately.
Aidan Kehoe <kehoea@parhasard.net>
parents:
5286
diff
changeset
|
157 differing about whether 0 is inside or outside the set. The Oxford |
c096d8051f89
Have NATNUMP give t for positive bignums; check limits appropriately.
Aidan Kehoe <kehoea@parhasard.net>
parents:
5286
diff
changeset
|
158 English Dictionary, second edition, does say that they are whole numbers, |
c096d8051f89
Have NATNUMP give t for positive bignums; check limits appropriately.
Aidan Kehoe <kehoea@parhasard.net>
parents:
5286
diff
changeset
|
159 not fractional, but it doesn't give a bound, and gives a quotation |
c096d8051f89
Have NATNUMP give t for positive bignums; check limits appropriately.
Aidan Kehoe <kehoea@parhasard.net>
parents:
5286
diff
changeset
|
160 talking about the natural numbers from 1 to 100. Since 100 is certainly |
c096d8051f89
Have NATNUMP give t for positive bignums; check limits appropriately.
Aidan Kehoe <kehoea@parhasard.net>
parents:
5286
diff
changeset
|
161 *not* the upper bound on natural numbers, we can't take 1 as the lower |
c096d8051f89
Have NATNUMP give t for positive bignums; check limits appropriately.
Aidan Kehoe <kehoea@parhasard.net>
parents:
5286
diff
changeset
|
162 bound from that example. The Real Academia Española's dictionary, not of |
c096d8051f89
Have NATNUMP give t for positive bignums; check limits appropriately.
Aidan Kehoe <kehoea@parhasard.net>
parents:
5286
diff
changeset
|
163 English but certainly sharing the western academic tradition, says of |
c096d8051f89
Have NATNUMP give t for positive bignums; check limits appropriately.
Aidan Kehoe <kehoea@parhasard.net>
parents:
5286
diff
changeset
|
164 "número natural": |
c096d8051f89
Have NATNUMP give t for positive bignums; check limits appropriately.
Aidan Kehoe <kehoea@parhasard.net>
parents:
5286
diff
changeset
|
165 |
c096d8051f89
Have NATNUMP give t for positive bignums; check limits appropriately.
Aidan Kehoe <kehoea@parhasard.net>
parents:
5286
diff
changeset
|
166 1. m. Mat. Cada uno de los elementos de la sucesión 0, 1, 2, 3... |
c096d8051f89
Have NATNUMP give t for positive bignums; check limits appropriately.
Aidan Kehoe <kehoea@parhasard.net>
parents:
5286
diff
changeset
|
167 |
c096d8051f89
Have NATNUMP give t for positive bignums; check limits appropriately.
Aidan Kehoe <kehoea@parhasard.net>
parents:
5286
diff
changeset
|
168 that is, "each of the elements of the succession 0, 1, 2, 3 ...". The |
c096d8051f89
Have NATNUMP give t for positive bignums; check limits appropriately.
Aidan Kehoe <kehoea@parhasard.net>
parents:
5286
diff
changeset
|
169 various Wikipedia articles in languages I can read agree. It's |
c096d8051f89
Have NATNUMP give t for positive bignums; check limits appropriately.
Aidan Kehoe <kehoea@parhasard.net>
parents:
5286
diff
changeset
|
170 reasonable to call this macro and the associated Lisp function |
c096d8051f89
Have NATNUMP give t for positive bignums; check limits appropriately.
Aidan Kehoe <kehoea@parhasard.net>
parents:
5286
diff
changeset
|
171 NATNUMP. */ |
c096d8051f89
Have NATNUMP give t for positive bignums; check limits appropriately.
Aidan Kehoe <kehoea@parhasard.net>
parents:
5286
diff
changeset
|
172 |
c096d8051f89
Have NATNUMP give t for positive bignums; check limits appropriately.
Aidan Kehoe <kehoea@parhasard.net>
parents:
5286
diff
changeset
|
173 #ifdef HAVE_BIGNUM |
c096d8051f89
Have NATNUMP give t for positive bignums; check limits appropriately.
Aidan Kehoe <kehoea@parhasard.net>
parents:
5286
diff
changeset
|
174 #define NATNUMP(x) ((INTP (x) && XINT (x) >= 0) || \ |
c096d8051f89
Have NATNUMP give t for positive bignums; check limits appropriately.
Aidan Kehoe <kehoea@parhasard.net>
parents:
5286
diff
changeset
|
175 (BIGNUMP (x) && bignum_sign (XBIGNUM_DATA (x)) >= 0)) |
c096d8051f89
Have NATNUMP give t for positive bignums; check limits appropriately.
Aidan Kehoe <kehoea@parhasard.net>
parents:
5286
diff
changeset
|
176 #else |
c096d8051f89
Have NATNUMP give t for positive bignums; check limits appropriately.
Aidan Kehoe <kehoea@parhasard.net>
parents:
5286
diff
changeset
|
177 #define NATNUMP(x) (INTP (x) && XINT (x) >= 0) |
c096d8051f89
Have NATNUMP give t for positive bignums; check limits appropriately.
Aidan Kehoe <kehoea@parhasard.net>
parents:
5286
diff
changeset
|
178 #endif |
c096d8051f89
Have NATNUMP give t for positive bignums; check limits appropriately.
Aidan Kehoe <kehoea@parhasard.net>
parents:
5286
diff
changeset
|
179 |
c096d8051f89
Have NATNUMP give t for positive bignums; check limits appropriately.
Aidan Kehoe <kehoea@parhasard.net>
parents:
5286
diff
changeset
|
180 #define CHECK_NATNUM(x) do { \ |
c096d8051f89
Have NATNUMP give t for positive bignums; check limits appropriately.
Aidan Kehoe <kehoea@parhasard.net>
parents:
5286
diff
changeset
|
181 if (!NATNUMP (x)) \ |
c096d8051f89
Have NATNUMP give t for positive bignums; check limits appropriately.
Aidan Kehoe <kehoea@parhasard.net>
parents:
5286
diff
changeset
|
182 dead_wrong_type_argument (Qnatnump, x); \ |
c096d8051f89
Have NATNUMP give t for positive bignums; check limits appropriately.
Aidan Kehoe <kehoea@parhasard.net>
parents:
5286
diff
changeset
|
183 } while (0) |
c096d8051f89
Have NATNUMP give t for positive bignums; check limits appropriately.
Aidan Kehoe <kehoea@parhasard.net>
parents:
5286
diff
changeset
|
184 |
c096d8051f89
Have NATNUMP give t for positive bignums; check limits appropriately.
Aidan Kehoe <kehoea@parhasard.net>
parents:
5286
diff
changeset
|
185 #define CONCHECK_NATNUM(x) do { \ |
c096d8051f89
Have NATNUMP give t for positive bignums; check limits appropriately.
Aidan Kehoe <kehoea@parhasard.net>
parents:
5286
diff
changeset
|
186 if (!NATNUMP (x)) \ |
c096d8051f89
Have NATNUMP give t for positive bignums; check limits appropriately.
Aidan Kehoe <kehoea@parhasard.net>
parents:
5286
diff
changeset
|
187 x = wrong_type_argument (Qnatnump, x); \ |
c096d8051f89
Have NATNUMP give t for positive bignums; check limits appropriately.
Aidan Kehoe <kehoea@parhasard.net>
parents:
5286
diff
changeset
|
188 } while (0) |
c096d8051f89
Have NATNUMP give t for positive bignums; check limits appropriately.
Aidan Kehoe <kehoea@parhasard.net>
parents:
5286
diff
changeset
|
189 |
1983 | 190 |
191 /********************************** Ratios **********************************/ | |
192 #ifdef HAVE_RATIO | |
193 | |
194 struct Lisp_Ratio | |
195 { | |
5120
d1247f3cc363
latest work on lisp-object workspace;
Ben Wing <ben@xemacs.org>
parents:
5118
diff
changeset
|
196 FROB_BLOCK_LISP_OBJECT_HEADER lheader; |
1983 | 197 ratio data; |
198 }; | |
199 typedef struct Lisp_Ratio Lisp_Ratio; | |
200 | |
5118
e0db3c197671
merge up to latest default branch, doesn't compile yet
Ben Wing <ben@xemacs.org>
parents:
4678
diff
changeset
|
201 DECLARE_LISP_OBJECT (ratio, Lisp_Ratio); |
1983 | 202 #define XRATIO(x) XRECORD (x, ratio, Lisp_Ratio) |
203 #define wrap_ratio(p) wrap_record (p, ratio) | |
204 #define RATIOP(x) RECORDP (x, ratio) | |
205 #define CHECK_RATIO(x) CHECK_RECORD (x, ratio) | |
206 #define CONCHECK_RATIO(x) CONCHECK_RECORD (x, ratio) | |
207 | |
208 #define ratio_data(r) (r)->data | |
209 | |
210 #define XRATIO_DATA(r) ratio_data (XRATIO (r)) | |
211 #define XRATIO_NUMERATOR(r) ratio_numerator (XRATIO_DATA (r)) | |
212 #define XRATIO_DENOMINATOR(r) ratio_denominator (XRATIO_DATA (r)) | |
213 | |
214 #define RATIO_ARITH_RETURN(r,op) do \ | |
215 { \ | |
216 Lisp_Object retval = make_ratio (0L, 1UL); \ | |
217 ratio_##op (XRATIO_DATA (retval), XRATIO_DATA (r)); \ | |
218 return Fcanonicalize_number (retval); \ | |
219 } while (0) | |
220 | |
221 #define RATIO_ARITH_RETURN1(r,op,arg) do \ | |
222 { \ | |
223 Lisp_Object retval = make_ratio (0L, 1UL); \ | |
224 ratio_##op (XRATIO_DATA (retval), XRATIO_DATA (r), arg); \ | |
225 return Fcanonicalize_number (retval); \ | |
226 } while (0) | |
227 | |
228 extern Lisp_Object make_ratio (long, unsigned long); | |
229 extern Lisp_Object make_ratio_bg (bignum, bignum); | |
230 extern Lisp_Object make_ratio_rt (ratio); | |
4678
b5e1d4f6b66f
Make #'floor, #'ceiling, #'round, #'truncate conform to Common Lisp.
Aidan Kehoe <kehoea@parhasard.net>
parents:
3391
diff
changeset
|
231 extern ratio scratch_ratio, scratch_ratio2; |
1983 | 232 |
233 #else /* !HAVE_RATIO */ | |
234 | |
235 #define RATIOP(x) 0 | |
236 #define CHECK_RATIO(x) dead_wrong_type_argument (Qratiop, x) | |
237 #define CONCHECK_RATIO(x) dead_wrong_type_argument (Qratiop, x) | |
238 typedef void ratio; | |
239 #define make_ratio(n,d) This XEmacs does not support ratios | |
240 #define make_ratio_bg(n,d) This XEmacs does not support ratios | |
241 | |
242 #endif /* HAVE_RATIO */ | |
243 | |
2092 | 244 extern Lisp_Object Qratiop; |
1983 | 245 EXFUN (Fratiop, 1); |
246 | |
247 | |
248 /******************************** Rationals *********************************/ | |
249 extern Lisp_Object Qrationalp; | |
250 | |
251 #define RATIONALP(x) (INTEGERP(x) || RATIOP(x)) | |
252 #define CHECK_RATIONAL(x) do { \ | |
253 if (!RATIONALP (x)) \ | |
254 dead_wrong_type_argument (Qrationalp, x); \ | |
255 } while (0) | |
256 #define CONCHECK_RATIONAL(x) do { \ | |
257 if (!RATIONALP (x)) \ | |
258 x = wrong_type_argument (Qrationalp, x); \ | |
259 } while (0) | |
260 | |
261 EXFUN (Frationalp, 1); | |
262 EXFUN (Fnumerator, 1); | |
263 EXFUN (Fdenominator, 1); | |
264 | |
265 | |
266 /******************************** Bigfloats *********************************/ | |
267 #ifdef HAVE_BIGFLOAT | |
268 struct Lisp_Bigfloat | |
269 { | |
5120
d1247f3cc363
latest work on lisp-object workspace;
Ben Wing <ben@xemacs.org>
parents:
5118
diff
changeset
|
270 FROB_BLOCK_LISP_OBJECT_HEADER lheader; |
1983 | 271 bigfloat bf; |
272 }; | |
273 typedef struct Lisp_Bigfloat Lisp_Bigfloat; | |
274 | |
5118
e0db3c197671
merge up to latest default branch, doesn't compile yet
Ben Wing <ben@xemacs.org>
parents:
4678
diff
changeset
|
275 DECLARE_LISP_OBJECT (bigfloat, Lisp_Bigfloat); |
1983 | 276 #define XBIGFLOAT(x) XRECORD (x, bigfloat, Lisp_Bigfloat) |
277 #define wrap_bigfloat(p) wrap_record (p, bigfloat) | |
278 #define BIGFLOATP(x) RECORDP (x, bigfloat) | |
279 #define CHECK_BIGFLOAT(x) CHECK_RECORD (x, bigfloat) | |
280 #define CONCHECK_BIGFLOAT(x) CONCHECK_RECORD (x, bigfloat) | |
281 | |
282 #define bigfloat_data(f) ((f)->bf) | |
283 #define XBIGFLOAT_DATA(x) bigfloat_data (XBIGFLOAT (x)) | |
284 #define XBIGFLOAT_GET_PREC(x) bigfloat_get_prec (XBIGFLOAT_DATA (x)) | |
285 #define XBIGFLOAT_SET_PREC(x,p) bigfloat_set_prec (XBIGFLOAT_DATA (x), p) | |
286 | |
4678
b5e1d4f6b66f
Make #'floor, #'ceiling, #'round, #'truncate conform to Common Lisp.
Aidan Kehoe <kehoea@parhasard.net>
parents:
3391
diff
changeset
|
287 #define BIGFLOAT_ARITH_RETURN(f,op) do \ |
b5e1d4f6b66f
Make #'floor, #'ceiling, #'round, #'truncate conform to Common Lisp.
Aidan Kehoe <kehoea@parhasard.net>
parents:
3391
diff
changeset
|
288 { \ |
b5e1d4f6b66f
Make #'floor, #'ceiling, #'round, #'truncate conform to Common Lisp.
Aidan Kehoe <kehoea@parhasard.net>
parents:
3391
diff
changeset
|
289 Lisp_Object retval = make_bigfloat (0.0, bigfloat_get_default_prec()); \ |
1983 | 290 bigfloat_##op (XBIGFLOAT_DATA (retval), XBIGFLOAT_DATA (f)); \ |
291 return retval; \ | |
292 } while (0) | |
293 | |
294 #define BIGFLOAT_ARITH_RETURN1(f,op,arg) do \ | |
295 { \ | |
4678
b5e1d4f6b66f
Make #'floor, #'ceiling, #'round, #'truncate conform to Common Lisp.
Aidan Kehoe <kehoea@parhasard.net>
parents:
3391
diff
changeset
|
296 Lisp_Object retval = make_bigfloat (0.0, bigfloat_get_default_prec()); \ |
1983 | 297 bigfloat_##op (XBIGFLOAT_DATA (retval), XBIGFLOAT_DATA (f), arg); \ |
298 return retval; \ | |
299 } while (0) | |
300 | |
301 extern Lisp_Object make_bigfloat (double, unsigned long); | |
302 extern Lisp_Object make_bigfloat_bf (bigfloat); | |
303 extern Lisp_Object Vdefault_float_precision; | |
304 extern bigfloat scratch_bigfloat, scratch_bigfloat2; | |
305 | |
306 #else /* !HAVE_BIGFLOAT */ | |
307 | |
308 #define BIGFLOATP(x) 0 | |
309 #define CHECK_BIGFLOAT(x) dead_wrong_type_argument (Qbigfloatp, x) | |
310 #define CONCHECK_BIGFLOAT(x) dead_wrong_type_argument (Qbigfloatp, x) | |
311 typedef void bigfloat; | |
312 #define make_bigfloat(f) This XEmacs does not support bigfloats | |
313 #define make_bigfloat_bf(f) This XEmacs does not support bigfloast | |
314 | |
315 #endif /* HAVE_BIGFLOAT */ | |
316 | |
2092 | 317 extern Lisp_Object Qbigfloatp; |
1983 | 318 EXFUN (Fbigfloatp, 1); |
319 | |
320 /********************************* Floating *********************************/ | |
4932 | 321 extern Lisp_Object Qfloatingp; |
1983 | 322 extern Lisp_Object Qread_default_float_format, Vread_default_float_format; |
323 | |
324 #define FLOATINGP(x) (FLOATP (x) || BIGFLOATP (x)) | |
325 #define CHECK_FLOATING(x) do { \ | |
326 if (!FLOATINGP (x)) \ | |
327 dead_wrong_type_argument (Qfloatingp, x); \ | |
328 } while (0) | |
329 #define CONCHECK_FLOATING(x) do { \ | |
330 if (!FLOATINGP (x)) \ | |
331 x = wrong_type_argument (Qfloating, x); \ | |
332 } while (0) | |
333 | |
2057 | 334 extern Lisp_Object make_floating (double); |
1983 | 335 EXFUN (Ffloatp, 1); |
336 | |
337 | |
338 /********************************** Reals ***********************************/ | |
339 extern Lisp_Object Qrealp; | |
340 | |
341 #define REALP(x) (RATIONALP (x) || FLOATINGP (x)) | |
342 #define CHECK_REAL(x) do { \ | |
343 if (!REALP (x)) \ | |
344 dead_wrong_type_argument (Qrealp, x); \ | |
345 } while (0) | |
346 #define CONCHECK_REAL(x) do { \ | |
347 if (!REALP (x)) \ | |
348 x = wrong_type_argument (Qrealp, x); \ | |
349 } while (0) | |
350 | |
351 EXFUN (Frealp, 1); | |
352 | |
353 | |
354 /********************************* Numbers **********************************/ | |
4932 | 355 /* Qnumberp in lisp.h */ |
1983 | 356 #define NUMBERP(x) REALP (x) |
357 #define CHECK_NUMBER(x) do { \ | |
358 if (!NUMBERP (x)) \ | |
359 dead_wrong_type_argument (Qnumberp, x); \ | |
360 } while (0) | |
361 #define CONCHECK_NUMBER(x) do { \ | |
362 if (!NUMBERP (x)) \ | |
363 x = wrong_type_argument (Qnumberp, x); \ | |
364 } while (0) | |
365 | |
366 EXFUN (Fcanonicalize_number, 1); | |
367 | |
368 enum number_type {FIXNUM_T, BIGNUM_T, RATIO_T, FLOAT_T, BIGFLOAT_T}; | |
369 | |
1995 | 370 extern enum number_type get_number_type (Lisp_Object); |
1983 | 371 extern enum number_type promote_args (Lisp_Object *, Lisp_Object *); |
372 | |
4885
6772ce4d982b
Fix hash tables, #'member*, #'assoc*, #'eql compiler macros if bignums
Aidan Kehoe <kehoea@parhasard.net>
parents:
4802
diff
changeset
|
373 #ifdef WITH_NUMBER_TYPES |
6772ce4d982b
Fix hash tables, #'member*, #'assoc*, #'eql compiler macros if bignums
Aidan Kehoe <kehoea@parhasard.net>
parents:
4802
diff
changeset
|
374 DECLARE_INLINE_HEADER ( |
6772ce4d982b
Fix hash tables, #'member*, #'assoc*, #'eql compiler macros if bignums
Aidan Kehoe <kehoea@parhasard.net>
parents:
4802
diff
changeset
|
375 int |
6772ce4d982b
Fix hash tables, #'member*, #'assoc*, #'eql compiler macros if bignums
Aidan Kehoe <kehoea@parhasard.net>
parents:
4802
diff
changeset
|
376 non_fixnum_number_p (Lisp_Object object)) |
6772ce4d982b
Fix hash tables, #'member*, #'assoc*, #'eql compiler macros if bignums
Aidan Kehoe <kehoea@parhasard.net>
parents:
4802
diff
changeset
|
377 { |
6772ce4d982b
Fix hash tables, #'member*, #'assoc*, #'eql compiler macros if bignums
Aidan Kehoe <kehoea@parhasard.net>
parents:
4802
diff
changeset
|
378 if (LRECORDP (object)) |
6772ce4d982b
Fix hash tables, #'member*, #'assoc*, #'eql compiler macros if bignums
Aidan Kehoe <kehoea@parhasard.net>
parents:
4802
diff
changeset
|
379 { |
6772ce4d982b
Fix hash tables, #'member*, #'assoc*, #'eql compiler macros if bignums
Aidan Kehoe <kehoea@parhasard.net>
parents:
4802
diff
changeset
|
380 switch (XRECORD_LHEADER (object)->type) |
6772ce4d982b
Fix hash tables, #'member*, #'assoc*, #'eql compiler macros if bignums
Aidan Kehoe <kehoea@parhasard.net>
parents:
4802
diff
changeset
|
381 { |
6772ce4d982b
Fix hash tables, #'member*, #'assoc*, #'eql compiler macros if bignums
Aidan Kehoe <kehoea@parhasard.net>
parents:
4802
diff
changeset
|
382 case lrecord_type_float: |
6772ce4d982b
Fix hash tables, #'member*, #'assoc*, #'eql compiler macros if bignums
Aidan Kehoe <kehoea@parhasard.net>
parents:
4802
diff
changeset
|
383 #ifdef HAVE_BIGNUM |
6772ce4d982b
Fix hash tables, #'member*, #'assoc*, #'eql compiler macros if bignums
Aidan Kehoe <kehoea@parhasard.net>
parents:
4802
diff
changeset
|
384 case lrecord_type_bignum: |
6772ce4d982b
Fix hash tables, #'member*, #'assoc*, #'eql compiler macros if bignums
Aidan Kehoe <kehoea@parhasard.net>
parents:
4802
diff
changeset
|
385 #endif |
6772ce4d982b
Fix hash tables, #'member*, #'assoc*, #'eql compiler macros if bignums
Aidan Kehoe <kehoea@parhasard.net>
parents:
4802
diff
changeset
|
386 #ifdef HAVE_RATIO |
6772ce4d982b
Fix hash tables, #'member*, #'assoc*, #'eql compiler macros if bignums
Aidan Kehoe <kehoea@parhasard.net>
parents:
4802
diff
changeset
|
387 case lrecord_type_ratio: |
6772ce4d982b
Fix hash tables, #'member*, #'assoc*, #'eql compiler macros if bignums
Aidan Kehoe <kehoea@parhasard.net>
parents:
4802
diff
changeset
|
388 #endif |
6772ce4d982b
Fix hash tables, #'member*, #'assoc*, #'eql compiler macros if bignums
Aidan Kehoe <kehoea@parhasard.net>
parents:
4802
diff
changeset
|
389 #ifdef HAVE_BIGFLOAT |
6772ce4d982b
Fix hash tables, #'member*, #'assoc*, #'eql compiler macros if bignums
Aidan Kehoe <kehoea@parhasard.net>
parents:
4802
diff
changeset
|
390 case lrecord_type_bigfloat: |
6772ce4d982b
Fix hash tables, #'member*, #'assoc*, #'eql compiler macros if bignums
Aidan Kehoe <kehoea@parhasard.net>
parents:
4802
diff
changeset
|
391 #endif |
6772ce4d982b
Fix hash tables, #'member*, #'assoc*, #'eql compiler macros if bignums
Aidan Kehoe <kehoea@parhasard.net>
parents:
4802
diff
changeset
|
392 return 1; |
6772ce4d982b
Fix hash tables, #'member*, #'assoc*, #'eql compiler macros if bignums
Aidan Kehoe <kehoea@parhasard.net>
parents:
4802
diff
changeset
|
393 } |
6772ce4d982b
Fix hash tables, #'member*, #'assoc*, #'eql compiler macros if bignums
Aidan Kehoe <kehoea@parhasard.net>
parents:
4802
diff
changeset
|
394 } |
6772ce4d982b
Fix hash tables, #'member*, #'assoc*, #'eql compiler macros if bignums
Aidan Kehoe <kehoea@parhasard.net>
parents:
4802
diff
changeset
|
395 return 0; |
6772ce4d982b
Fix hash tables, #'member*, #'assoc*, #'eql compiler macros if bignums
Aidan Kehoe <kehoea@parhasard.net>
parents:
4802
diff
changeset
|
396 } |
6772ce4d982b
Fix hash tables, #'member*, #'assoc*, #'eql compiler macros if bignums
Aidan Kehoe <kehoea@parhasard.net>
parents:
4802
diff
changeset
|
397 #define NON_FIXNUM_NUMBER_P(X) non_fixnum_number_p (X) |
6772ce4d982b
Fix hash tables, #'member*, #'assoc*, #'eql compiler macros if bignums
Aidan Kehoe <kehoea@parhasard.net>
parents:
4802
diff
changeset
|
398 |
6772ce4d982b
Fix hash tables, #'member*, #'assoc*, #'eql compiler macros if bignums
Aidan Kehoe <kehoea@parhasard.net>
parents:
4802
diff
changeset
|
399 #else |
6772ce4d982b
Fix hash tables, #'member*, #'assoc*, #'eql compiler macros if bignums
Aidan Kehoe <kehoea@parhasard.net>
parents:
4802
diff
changeset
|
400 #define NON_FIXNUM_NUMBER_P FLOATP |
6772ce4d982b
Fix hash tables, #'member*, #'assoc*, #'eql compiler macros if bignums
Aidan Kehoe <kehoea@parhasard.net>
parents:
4802
diff
changeset
|
401 #endif |
6772ce4d982b
Fix hash tables, #'member*, #'assoc*, #'eql compiler macros if bignums
Aidan Kehoe <kehoea@parhasard.net>
parents:
4802
diff
changeset
|
402 |
6772ce4d982b
Fix hash tables, #'member*, #'assoc*, #'eql compiler macros if bignums
Aidan Kehoe <kehoea@parhasard.net>
parents:
4802
diff
changeset
|
403 |
1983 | 404 #endif /* INCLUDED_number_h_ */ |