127 lines
3.4 KiB
C
127 lines
3.4 KiB
C
/*
|
|
*
|
|
* b o o l e a n . c -- Booleans and Equivalence predicates
|
|
*
|
|
* Copyright © 1993-1999 Erick Gallesio - I3S-CNRS/ESSI <eg@unice.fr>
|
|
*
|
|
*
|
|
* Permission to use, copy, modify, distribute,and license this
|
|
* software and its documentation for any purpose is hereby granted,
|
|
* provided that existing copyright notices are retained in all
|
|
* copies and that this notice is included verbatim in any
|
|
* distributions. No written agreement, license, or royalty fee is
|
|
* required for any of the authorized uses.
|
|
* This software is provided ``AS IS'' without express or implied
|
|
* warranty.
|
|
*
|
|
* Author: Erick Gallesio [eg@kaolin.unice.fr]
|
|
* Creation date: 23-Oct-1993 21:37
|
|
* Last file update: 3-Sep-1999 20:18 (eg)
|
|
*/
|
|
|
|
#include "stk.h"
|
|
#include "extend.h"
|
|
#ifdef USE_STKLOS
|
|
# include "stklos.h"
|
|
#endif
|
|
|
|
PRIMITIVE STk_not(SCM x)
|
|
{
|
|
return EQ(x, Ntruth) ? Truth : Ntruth;
|
|
}
|
|
|
|
PRIMITIVE STk_booleanp(SCM x)
|
|
{
|
|
return BOOLEANP(x) ? Truth: Ntruth;
|
|
}
|
|
|
|
PRIMITIVE STk_eq(SCM x,SCM y)
|
|
{
|
|
return EQ(x,y) ? Truth : Ntruth;
|
|
}
|
|
|
|
PRIMITIVE STk_eqv(SCM x, SCM y)
|
|
{
|
|
if (EQ(x,y)) return(Truth);
|
|
|
|
switch (TYPE(x)) {
|
|
case tc_symbol: if (SYMBOLP(y) && strcmp(PNAME(x), PNAME(y)) == 0)
|
|
return Truth;
|
|
break;
|
|
case tc_integer:
|
|
case tc_flonum:
|
|
case tc_bignum: if (NUMBERP(y)) {
|
|
if ((EXACTP(x) && FLONUMP(y)) || (FLONUMP(x) && EXACTP(y)))
|
|
return Ntruth;
|
|
return (STk_equal_numbers(x, y)) ? Truth : Ntruth;
|
|
}
|
|
break;
|
|
#ifndef COMPACT_SMALL_CST
|
|
case tc_char: if (CHARP(y) && CHAR(x) == CHAR(y)) return Truth;
|
|
break;
|
|
#endif
|
|
case tc_keyword: if (KEYWORDP(y) && strcmp(KEYVAL(x), KEYVAL(y)) == 0)
|
|
return Truth;
|
|
break;
|
|
case tc_env: if (EQ(x->storage_as.env.data, y->storage_as.env.data))
|
|
return Truth;
|
|
break;
|
|
#ifdef USE_STKLOS
|
|
case tc_instance: {
|
|
SCM fct = STk_STklos_value(Intern("object-eqv?"));
|
|
|
|
/* Test for UNBOUND, cause gf are not defined during boot */
|
|
return (fct == UNBOUND) ? Ntruth : Apply2(fct, x, y);
|
|
}
|
|
#endif
|
|
default: if (EXTENDEDP(x) && EXTENDEDP(y) && TYPE(x) == TYPE(y))
|
|
return STk_extended_compare(x, y, FALSE);
|
|
}
|
|
/* What can we do else? */
|
|
return Ntruth;
|
|
}
|
|
|
|
|
|
PRIMITIVE STk_equal(SCM x, SCM y)
|
|
{
|
|
Top:
|
|
if (STk_eqv(x, y) == Truth) return Truth;
|
|
|
|
switch (TYPE(x)) {
|
|
case tc_cons: if (CONSP(y)) {
|
|
if (STk_equal(CAR(x), CAR(y)) == Ntruth) return Ntruth;
|
|
x = CDR(x); y = CDR(y);
|
|
goto Top;
|
|
}
|
|
break;
|
|
case tc_string: if (STRINGP(y))
|
|
return (strcmp(CHARS(x), CHARS(y))==0) ? Truth: Ntruth;
|
|
break;
|
|
case tc_vector: if (VECTORP(y)) {
|
|
long lx, ly, i;
|
|
SCM *vx, *vy;
|
|
|
|
lx = VECTSIZE(x); ly = VECTSIZE(y);
|
|
if (lx != ly) return Ntruth;
|
|
|
|
for (i=0, vx=VECT(x), vy=VECT(y); i < lx; i++)
|
|
if (STk_equal(vx[i], vy[i]) == Ntruth) return Ntruth;
|
|
return Truth;
|
|
}
|
|
break;
|
|
#ifdef USE_STKLOS
|
|
case tc_instance: {
|
|
SCM fct = STk_STklos_value(Intern("object-equal?"));
|
|
|
|
/* Test for UNBOUND, cause gf are not defined during boot */
|
|
return (fct == UNBOUND) ? Ntruth : Apply2(fct, x, y);
|
|
}
|
|
#endif
|
|
default: if (EXTENDEDP(x) && EXTENDEDP(y) && TYPE(x) == TYPE(y))
|
|
return STk_extended_compare(x, y, TRUE);
|
|
}
|
|
return Ntruth;
|
|
}
|
|
|
|
|