summaryrefslogtreecommitdiff
path: root/libguile/array-map.c
diff options
context:
space:
mode:
authorAndy Wingo <wingo@pobox.com>2010-03-31 00:05:01 +0200
committerAndy Wingo <wingo@pobox.com>2010-03-31 00:05:01 +0200
commit3ffd1ba96e986581d97079308fc15ef1fc933cdb (patch)
treeff23f8f950b47fc3c335706196b20b5d4c0ca137 /libguile/array-map.c
parentd26383f427245e088401f53af64b44062750925e (diff)
downloadguile-3ffd1ba96e986581d97079308fc15ef1fc933cdb.tar.gz
fix equal? between an array and a non-array
OK let's try again. While the thanks go to Daniel Llorens del Río for the tip, the blame continues going to me :) * test-suite/Makefile.am: * test-suite/tests/arrays.test: Add a test. * libguile/array-map.c (raeql): Handle a few 0-dimensional cases. If the shapes of the arrays don't match, just return #f instead of raising an error.
Diffstat (limited to 'libguile/array-map.c')
-rw-r--r--libguile/array-map.c22
1 files changed, 15 insertions, 7 deletions
diff --git a/libguile/array-map.c b/libguile/array-map.c
index 2041d0580..46acb2915 100644
--- a/libguile/array-map.c
+++ b/libguile/array-map.c
@@ -863,20 +863,29 @@ raeql (SCM ra0, SCM as_equal, SCM ra1)
scm_t_array_dim *s0 = &dim0, *s1 = &dim1;
unsigned long bas0 = 0, bas1 = 0;
int k, unroll = 1, vlen = 1, ndim = 1;
+
if (SCM_I_ARRAYP (ra0))
{
+ if (SCM_I_ARRAY_NDIM (ra0) == 0)
+ return scm_is_true (scm_equal_p (scm_array_ref (ra0, SCM_EOL), ra1));
ndim = SCM_I_ARRAY_NDIM (ra0);
s0 = SCM_I_ARRAY_DIMS (ra0);
bas0 = SCM_I_ARRAY_BASE (ra0);
v0 = SCM_I_ARRAY_V (ra0);
}
- else
+ else if (scm_is_generalized_vector (v0))
{
s0->inc = 1;
s0->lbnd = 0;
s0->ubnd = scm_c_generalized_vector_length (v0) - 1;
unroll = 0;
}
+ else if (SCM_I_ARRAYP (ra1) && SCM_I_ARRAY_NDIM (ra1) == 0)
+ return scm_is_true (scm_equal_p (ra0, scm_array_ref (ra1, SCM_EOL)));
+ else
+ /* It's just not working out, dear. */
+ return 0;
+
if (SCM_I_ARRAYP (ra1))
{
if (ndim != SCM_I_ARRAY_NDIM (ra1))
@@ -885,18 +894,17 @@ raeql (SCM ra0, SCM as_equal, SCM ra1)
bas1 = SCM_I_ARRAY_BASE (ra1);
v1 = SCM_I_ARRAY_V (ra1);
}
- else
+ else if (scm_is_generalized_vector (v1))
{
- /*
- Huh ? Schizophrenic return type. --hwn
- */
- if (1 != ndim)
- return 0;
s1->inc = 1;
s1->lbnd = 0;
s1->ubnd = scm_c_generalized_vector_length (v1) - 1;
unroll = 0;
}
+ else
+ /* It's not you, it's me. */
+ return 0;
+
if (SCM_TYP7 (v0) != SCM_TYP7 (v1))
return 0;
for (k = ndim; k--;)