stk/Src/boolean.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;
}