* Makefile.am (DEFS): Added. automake adds -I options to DEFS,
[bpt/guile.git] / libguile / eq.c
CommitLineData
950cc72b 1/* Copyright (C) 1995,1996,1997,1998, 2000 Free Software Foundation, Inc.
0f2d19dd
JB
2 *
3 * This program is free software; you can redistribute it and/or modify
4 * it under the terms of the GNU General Public License as published by
5 * the Free Software Foundation; either version 2, or (at your option)
6 * any later version.
7 *
8 * This program is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 * GNU General Public License for more details.
12 *
13 * You should have received a copy of the GNU General Public License
14 * along with this software; see the file COPYING. If not, write to
82892bed
JB
15 * the Free Software Foundation, Inc., 59 Temple Place, Suite 330,
16 * Boston, MA 02111-1307 USA
0f2d19dd
JB
17 *
18 * As a special exception, the Free Software Foundation gives permission
19 * for additional uses of the text contained in its release of GUILE.
20 *
21 * The exception is that, if you link the GUILE library with other files
22 * to produce an executable, this does not by itself cause the
23 * resulting executable to be covered by the GNU General Public License.
24 * Your use of that executable is in no way restricted on account of
25 * linking the GUILE library code into it.
26 *
27 * This exception does not however invalidate any other reasons why
28 * the executable file might be covered by the GNU General Public License.
29 *
30 * This exception applies only to the code released by the
31 * Free Software Foundation under the name GUILE. If you copy
32 * code from other Free Software Foundation releases into a copy of
33 * GUILE, as the General Public License permits, the exception does
34 * not apply to the code that you add in this way. To avoid misleading
35 * anyone as to the status of such modified files, you must delete
36 * this exception notice from them.
37 *
38 * If you write modifications of your own for GUILE, it is your choice
39 * whether to permit this exception to apply to your modifications.
82892bed 40 * If you do not wish that, delete this exception notice. */
1bbd0b84
GB
41
42/* Software engineering face-lift by Greg J. Badros, 11-Dec-1999,
43 gjb@cs.washington.edu, http://www.cs.washington.edu/homes/gjb */
44
0f2d19dd
JB
45\f
46#include <stdio.h>
a0599745
MD
47#include "libguile/_scm.h"
48#include "libguile/ramap.h"
49#include "libguile/stackchk.h"
50#include "libguile/strorder.h"
51#include "libguile/async.h"
52#include "libguile/root.h"
53#include "libguile/smob.h"
54#include "libguile/unif.h"
55#include "libguile/vectors.h"
0f2d19dd 56
a0599745
MD
57#include "libguile/validate.h"
58#include "libguile/eq.h"
0f2d19dd 59\f
c3ee7520 60SCM_DEFINE1 (scm_eq_p, "eq?", scm_tc7_rpsubr,
1bbd0b84 61 (SCM x, SCM y),
da4a1dba
GB
62 "Return #t iff X references the same object as Y.\n"
63 "`eq?' is similar to `eqv?' except that in some cases\n"
64 "it is capable of discerning distinctions finer than\n"
b450f070 65 "those detectable by `eqv?'.\n")
1bbd0b84 66#define FUNC_NAME s_scm_eq_p
0f2d19dd 67{
fbd485ba 68 return SCM_BOOL (SCM_EQ_P (x, y));
0f2d19dd 69}
1bbd0b84 70#undef FUNC_NAME
0f2d19dd
JB
71
72
c3ee7520 73SCM_DEFINE1 (scm_eqv_p, "eqv?", scm_tc7_rpsubr,
1bbd0b84 74 (SCM x, SCM y),
da4a1dba
GB
75 "The `eqv?' procedure defines a useful equivalence relation on objects.\n"
76 "Briefly, it returns #t if X and Y should normally be\n"
77 "regarded as the same object. This relation is left\n"
78 "slightly open to interpretation, but works for comparing\n"
79 "immediate integers, characters, and inexact numbers.\n")
1bbd0b84 80#define FUNC_NAME s_scm_eqv_p
0f2d19dd 81{
fbd485ba 82 if (SCM_EQ_P (x, y))
950cc72b
MD
83 return SCM_BOOL_T;
84 if (SCM_IMP (x))
85 return SCM_BOOL_F;
86 if (SCM_IMP (y))
87 return SCM_BOOL_F;
0f2d19dd 88 /* this ensures that types and scm_length are the same. */
fbd485ba 89 if (SCM_CELL_TYPE (x) != SCM_CELL_TYPE (y))
950cc72b
MD
90 {
91 /* treat mixes of real and complex types specially */
92 if (SCM_SLOPPY_INEXACTP (x))
93 {
94 if (SCM_SLOPPY_REALP (x))
95 return SCM_BOOL (SCM_SLOPPY_COMPLEXP (y)
96 && SCM_REAL_VALUE (x) == SCM_COMPLEX_REAL (y)
97 && 0.0 == SCM_COMPLEX_IMAG (y));
98 else
99 return SCM_BOOL (SCM_SLOPPY_REALP (y)
100 && SCM_COMPLEX_REAL (x) == SCM_REAL_VALUE (y)
101 && SCM_COMPLEX_IMAG (x) == 0.0);
102 }
103 return SCM_BOOL_F;
104 }
105 if (SCM_NUMP (x))
106 {
0f2d19dd 107# ifdef SCM_BIGDIG
950cc72b
MD
108 if (SCM_BIGP (x))
109 return SCM_BOOL (0 == scm_bigcomp (x, y));
0f2d19dd 110# endif
950cc72b
MD
111 if (SCM_REALPART (x) != SCM_REALPART(y)) return SCM_BOOL_F;
112 if (SCM_CPLXP(x) && (SCM_IMAG(x) != SCM_IMAG(y))) return SCM_BOOL_F;
113 return SCM_BOOL_T;
114 }
0f2d19dd
JB
115 return SCM_BOOL_F;
116}
1bbd0b84 117#undef FUNC_NAME
0f2d19dd
JB
118
119
c3ee7520 120SCM_DEFINE1 (scm_equal_p, "equal?", scm_tc7_rpsubr,
1bbd0b84 121 (SCM x, SCM y),
da4a1dba
GB
122 "Return #t iff X and Y are recursively `eqv?' equivalent.\n"
123 "`equal?' recursively compares the contents of pairs, vectors, and\n"
124 "strings, applying `eqv?' on other objects such as numbers and\n"
125 "symbols. A rule of thumb is that objects are generally `equal?'\n"
126 "if they print the same. `Equal?' may fail to terminate if its\n"
b450f070 127 "arguments are circular data structures.\n")
1bbd0b84 128#define FUNC_NAME s_scm_equal_p
0f2d19dd
JB
129{
130 SCM_CHECK_STACK;
950cc72b
MD
131 tailrecurse:
132 SCM_TICK;
fbd485ba 133 if (SCM_EQ_P (x, y))
950cc72b
MD
134 return SCM_BOOL_T;
135 if (SCM_IMP (x))
136 return SCM_BOOL_F;
137 if (SCM_IMP (y))
138 return SCM_BOOL_F;
139 if (SCM_SLOPPY_CONSP (x) && SCM_SLOPPY_CONSP (y))
140 {
141 if (SCM_FALSEP (scm_equal_p (SCM_CAR (x), SCM_CAR (y))))
142 return SCM_BOOL_F;
143 x = SCM_CDR(x);
144 y = SCM_CDR(y);
145 goto tailrecurse;
146 }
147 if (SCM_TYP7S (x) == scm_tc7_string && SCM_TYP7S (y) == scm_tc7_string)
148 return scm_string_equal_p (x, y);
149 /* This ensures that types and scm_length are the same. */
fbd485ba 150 if (SCM_CELL_TYPE (x) != SCM_CELL_TYPE (y))
950cc72b
MD
151 {
152 /* treat mixes of real and complex types specially */
153 if (SCM_SLOPPY_INEXACTP (x))
154 {
155 if (SCM_SLOPPY_REALP (x))
156 return SCM_BOOL (SCM_SLOPPY_COMPLEXP (y)
157 && SCM_REAL_VALUE (x) == SCM_COMPLEX_REAL (y)
158 && 0.0 == SCM_COMPLEX_IMAG (y));
159 else
160 return SCM_BOOL (SCM_SLOPPY_REALP (y)
161 && SCM_COMPLEX_REAL (x) == SCM_REAL_VALUE (y)
162 && SCM_COMPLEX_IMAG (x) == 0.0);
0f2d19dd 163 }
950cc72b
MD
164 return SCM_BOOL_F;
165 }
166 switch (SCM_TYP7 (x))
167 {
168 default:
169 return SCM_BOOL_F;
170 case scm_tc7_vector:
171 case scm_tc7_wvect:
172 return scm_vector_equal_p (x, y);
173 case scm_tc7_smob:
174 {
175 int i = SCM_SMOBNUM (x);
176 if (!(i < scm_numsmob))
177 return SCM_BOOL_F;
178 if (scm_smobs[i].equalp)
179 return (scm_smobs[i].equalp) (x, y);
180 else
181 return SCM_BOOL_F;
182 }
afe5177e 183#ifdef HAVE_ARRAYS
950cc72b
MD
184 case scm_tc7_bvect: case scm_tc7_uvect: case scm_tc7_ivect:
185 case scm_tc7_fvect: case scm_tc7_cvect: case scm_tc7_dvect:
186 case scm_tc7_svect:
5c11cc9d 187#ifdef HAVE_LONG_LONGS
950cc72b 188 case scm_tc7_llvect:
0f2d19dd 189#endif
950cc72b
MD
190 case scm_tc7_byvect:
191 if (scm_tc16_array && scm_smobs[0x0ff & (scm_tc16_array >> 8)].equalp)
192 return scm_array_equal_p (x, y);
afe5177e 193#endif
950cc72b
MD
194 }
195 return SCM_BOOL_F;
0f2d19dd 196}
1bbd0b84 197#undef FUNC_NAME
0f2d19dd
JB
198
199
200\f
201
202
1cc91f1b 203
0f2d19dd
JB
204void
205scm_init_eq ()
0f2d19dd 206{
a0599745 207#include "libguile/eq.x"
0f2d19dd
JB
208}
209
89e00824
ML
210
211/*
212 Local Variables:
213 c-file-style: "gnu"
214 End:
215*/