This is predicate.c in view mode; [Download] [Up]
/*
Copyright (C) 1994 M. Hagiya, W. Schelter, T. Yuasa
This file is part of GNU Common Lisp, herein referred to as GCL
GCL is free software; you can redistribute it and/or modify it under
the terms of the GNU LIBRARY GENERAL PUBLIC LICENSE as published by
the Free Software Foundation; either version 2, or (at your option)
any later version.
GCL is distributed in the hope that it will be useful, but WITHOUT
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public
License for more details.
You should have received a copy of the GNU Library General Public License
along with GCL; see the file COPYING. If not, write to the Free Software
Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
*/
/*
predicate.c
predicates
*/
#include "include.h"
DEFUN("NULL",object,fLnot,LISP
,1,1,NONE,OO,OO,OO,OO,"")();
DEFUNO("NOT",object,fLnot,LISP
,1,1,NONE,OO,OO,OO,OO,Lnull,"")(x0)
object x0;
{
/* 1 args */
if (x0 == Cnil)
x0 = Ct;
else
x0 = Cnil;
RETURN1(x0);
}
DEFUNO("SYMBOLP",object,fLsymbolp,LISP
,1,1,NONE,OO,OO,OO,OO,Lsymbolp,"")(x0)
object x0;
{
/* 1 args */
if (type_of(x0) == t_symbol)
x0 = Ct;
else
x0 = Cnil;
RETURN1(x0);
}
DEFUNO("ATOM",object,fLatom ,LISP
,1,1,NONE,OO,OO,OO,OO,Latom ,"")(x0)
object x0;
{
/* 1 args */
if (type_of(x0) != t_cons)
x0 = Ct;
else
x0 = Cnil;
RETURN1(x0);
}
DEFUNO("CONSP",object,fLconsp,LISP
,1,1,NONE,OO,OO,OO,OO,Lconsp,"")(x0)
object x0;
{
/* 1 args */
if (type_of(x0) == t_cons)
x0 = Ct;
else
x0 = Cnil;
RETURN1(x0);
}
DEFUNO("LISTP",object,fLlistp,LISP
,1,1,NONE,OO,OO,OO,OO,Llistp,"")(x0)
object x0;
{
/* 1 args */
if (x0 == Cnil || type_of(x0) == t_cons)
x0 = Ct;
else
x0 = Cnil;
RETURN1(x0);
}
DEFUNO("NUMBERP",object,fLnumberp,LISP
,1,1,NONE,OO,OO,OO,OO,Lnumberp,"")(x0)
object x0;
{
enum type t;
/* 1 args */
t = type_of(x0);
if (t == t_fixnum || t == t_bignum || t == t_ratio ||
t == t_shortfloat || t == t_longfloat ||
t == t_complex)
x0 = Ct;
else
x0 = Cnil;
RETURN1(x0);
}
DEFUNO("INTEGERP",object,fLintegerp ,LISP
,1,1,NONE,OO,OO,OO,OO,Lintegerp ,"")(x0)
object x0;
{
enum type t;
/* 1 args */
t = type_of(x0);
if (t == t_fixnum || t == t_bignum)
x0 = Ct;
else
x0 = Cnil;
RETURN1(x0);
}
DEFUNO("RATIONALP",object,fLrationalp,LISP
,1,1,NONE,OO,OO,OO,OO,Lrationalp,"")(x0)
object x0;
{
enum type t;
/* 1 args */
t = type_of(x0);
if (t == t_fixnum || t == t_bignum || t == t_ratio)
x0 = Ct;
else
x0 = Cnil;
RETURN1(x0);
}
DEFUN("REALP",object,fLrealp,LISP
,1,1,NONE,OO,OO,OO,OO,"")(x0)
object x0;
{
enum type t;
t = type_of(x0);
RETURN1((TS_MEMBER(t,TS(t_fixnum)| TS(t_bignum)| TS(t_ratio)|
TS(t_longfloat)| TS(t_shortfloat))
? Ct : Cnil));
}
DEFUNO("FLOATP",object,fLfloatp,LISP
,1,1,NONE,OO,OO,OO,OO,Lfloatp,"")(x0)
object x0;
{
enum type t;
/* 1 args */
t = type_of(x0);
if (t == t_longfloat || t == t_shortfloat)
x0 = Ct;
else
x0 = Cnil;
RETURN1(x0);}
DEFUNO("COMPLEXP",object,fLcomplexp,LISP
,1,1,NONE,OO,OO,OO,OO,Lcomplexp,"")(x0)
object x0;
{
/* 1 args */
if (type_of(x0) == t_complex)
x0 = Ct;
else
x0 = Cnil;
RETURN1(x0);}
DEFUNO("CHARACTERP",object,fLcharacterp,LISP
,1,1,NONE,OO,OO,OO,OO,Lcharacterp,"")(x0)
object x0;
{
/* 1 args */
if (type_of(x0) == t_character)
x0 = Ct;
else
x0 = Cnil;
RETURN1(x0);}
DEFUNO("STRINGP",object,fLstringp ,LISP
,1,1,NONE,OO,OO,OO,OO,Lstringp ,"")(x0)
object x0;
{
/* 1 args */
if (type_of(x0) == t_string)
x0 = Ct;
else
x0 = Cnil;
RETURN1(x0);}
DEFUNO("BIT-VECTOR-P",object,fLbit_vector_p,LISP
,1,1,NONE,OO,OO,OO,OO,Lbit_vector_p,"")(x0)
object x0;
{
/* 1 args */
if (type_of(x0) == t_bitvector)
x0 = Ct;
else
x0 = Cnil;
RETURN1(x0);}
DEFUNO("VECTORP",object,fLvectorp,LISP
,1,1,NONE,OO,OO,OO,OO,Lvectorp,"")(x0)
object x0;
{
enum type t;
/* 1 args */
t = type_of(x0);
if (t == t_vector || t == t_string || t == t_bitvector)
x0 = Ct;
else
x0 = Cnil;
RETURN1(x0);}
DEFUNO("SIMPLE-STRING-P",object,fLsimple_string_p,LISP
,1,1,NONE,OO,OO,OO,OO,Lsimple_string_p,"")(x0)
object x0;
{
/* 1 args */
if (type_of(x0) == t_string &&
/* !x0->st.st_adjustable && */
!x0->st.st_hasfillp &&
x0->st.st_displaced->c.c_car == Cnil)
x0 = Ct;
else
x0 = Cnil;
RETURN1(x0);}
DEFUNO("SIMPLE-BIT-VECTOR-P",object,fLsimple_bit_vector_p ,LISP
,1,1,NONE,OO,OO,OO,OO,Lsimple_bit_vector_p ,"")(x0)
object x0;
{
/* 1 args */
if (type_of(x0) == t_bitvector &&
/* !x0->bv.bv_adjustable && */
!x0->bv.bv_hasfillp &&
x0->bv.bv_displaced->c.c_car == Cnil)
x0 = Ct;
else
x0 = Cnil;
RETURN1(x0);}
DEFUNO("SIMPLE-VECTOR-P",object,fLsimple_vector_p ,LISP
,1,1,NONE,OO,OO,OO,OO,Lsimple_vector_p ,"")(x0)
object x0;
{
enum type t;
/* 1 args */
t = type_of(x0);
if (t == t_vector &&
/* !x0->v.v_adjustable && */
!x0->v.v_hasfillp &&
x0->v.v_displaced->c.c_car == Cnil &&
(enum aelttype)x0->v.v_elttype == aet_object)
x0 = Ct;
else
x0 = Cnil;
RETURN1(x0);}
DEFUNO("ARRAYP",object,fLarrayp ,LISP
,1,1,NONE,OO,OO,OO,OO,Larrayp ,"")(x0)
object x0;
{
enum type t;
/* 1 args */
t = type_of(x0);
if (t == t_array ||
t == t_vector || t == t_string || t == t_bitvector)
x0 = Ct;
else
x0 = Cnil;
RETURN1(x0);}
DEFUNO("PACKAGEP",object,fLpackagep ,LISP
,1,1,NONE,OO,OO,OO,OO,Lpackagep ,"")(x0)
object x0;
{
/* 1 args */
if (type_of(x0) == t_package)
x0 = Ct;
else
x0 = Cnil;
RETURN1(x0);}
DEFUNO("FUNCTIONP",object,fLfunctionp,LISP
,1,1,NONE,OO,OO,OO,OO,Lfunctionp,"")(x0)
object x0;
{
enum type t;
object x;
/* 1 args */
t = type_of(x0);
if (t == t_cfun || t == t_cclosure || t == t_sfun || t == t_gfun
|| t == t_closure|| t == t_afun
|| t == t_vfun)
x0 = Ct;
else if (t == t_symbol) {
if (x0->s.s_gfdef != OBJNULL &&
x0->s.s_mflag == FALSE)
x0 = Ct;
else
x0 = Cnil;
} else if (t == t_cons) {
x = x0->c.c_car;
if (x == sLlambda || x == sLlambda_block ||
x == sSlambda_block_expanded ||
x == sLlambda_closure || x == sLlambda_block_closure)
x0 = Ct;
else
x0 = Cnil;
} else
x0 = Cnil;
RETURN1(x0);}
DEFUNO("COMPILED-FUNCTION-P",object,fLcompiled_function_p,LISP
,1,1,NONE,OO,OO,OO,OO,Lcompiled_function_p,"")(x0)
object x0;
{
/* 1 args */;
if (type_of(x0) == t_cfun ||
type_of(x0) == t_cclosure ||
type_of(x0) == t_sfun ||
type_of(x0) == t_gfun ||
type_of(x0) == t_afun ||
type_of(x0) == t_closure ||
type_of(x0) == t_vfun
)
x0 = Ct;
else
x0 = Cnil;
RETURN1(x0);}
DEFUNO("COMMONP",object,fLcommonp,LISP
,1,1,NONE,OO,OO,OO,OO,Lcommonp,"")(x0)
object x0;
{
/* 1 args */;
if (type_of(x0) != t_spice)
x0 = Ct;
else
x0 = Cnil;
RETURN1(x0);}
DEFUNO("EQ",object,fLeq,LISP
,2,2,NONE,OO,OO,OO,OO,Leq,"")(x0,x1)
object x0,x1;
{
/* 2 args */
if (x0 == x1)
x0 = Ct;
else
x0 = Cnil;
RETURN1(x0)
;}
bool
eql(x, y)
object x, y;
{
enum type t;
if (x == y)
return(TRUE);
if ((t = type_of(x)) != type_of(y))
return(FALSE);
switch (t) {
case t_fixnum:
if (fix(x) == fix(y))
return(TRUE);
else
return(FALSE);
case t_bignum:
if (big_compare((struct bignum *)x,
(struct bignum *)y) == 0)
return(TRUE);
else
return(FALSE);
case t_ratio:
if (eql(x->rat.rat_num, y->rat.rat_num) &&
eql(x->rat.rat_den, y->rat.rat_den))
return(TRUE);
else
return(FALSE);
case t_shortfloat:
if (sf(x) == sf(y))
return(TRUE);
else
return(FALSE);
case t_longfloat:
if (lf(x) == lf(y))
return(TRUE);
else
return(FALSE);
case t_complex:
if (eql(x->cmp.cmp_real, y->cmp.cmp_real) &&
eql(x->cmp.cmp_imag, y->cmp.cmp_imag))
return(TRUE);
else
return(FALSE);
case t_character:
if (char_code(x) == char_code(y) &&
char_bits(x) == char_bits(y) &&
char_font(x) == char_font(y))
return(TRUE);
else
return(FALSE);
}
return(FALSE);
}
DEFUNO("EQL",object,fLeql,LISP
,2,2,NONE,OO,OO,OO,OO,Leql,"")(x0,x1)
object x0,x1;
{
/* 2 args */
if (eql(x0, x1))
x0 = Ct;
else
x0 = Cnil;
RETURN1(x0);}
bool
equal(x, y)
register object x;
#ifdef UNIX /* in non unix case cs_check want's an address */
register
#endif
object y;
{
register enum type t;
cs_check(y);
BEGIN:
if ((t = type_of(x)) != type_of(y))
return(FALSE);
if (x==y)
return(TRUE);
switch (t) {
case t_cons:
if (!equal(x->c.c_car, y->c.c_car))
return(FALSE);
x = x->c.c_cdr;
y = y->c.c_cdr;
goto BEGIN;
case t_structure:
case t_symbol:
case t_vector:
case t_array:
return FALSE;
case t_fixnum :
return(fix(x)==fix(y));
case t_shortfloat:
return(x->SF.SFVAL==y->SF.SFVAL);
case t_longfloat:
return(x->LF.LFVAL==y->LF.LFVAL);
case t_string:
return(string_eq(x, y));
case t_bitvector:
{
int i, ox, oy;
if (x->bv.bv_fillp != y->bv.bv_fillp)
return(FALSE);
ox = BV_OFFSET(x);
oy = BV_OFFSET(y);
for (i = 0; i < x->bv.bv_fillp; i++)
if((x->bv.bv_self[(i+ox)/8] & (0200>>(i+ox)%8))
!=(y->bv.bv_self[(i+oy)/8] & (0200>>(i+oy)%8)))
return(FALSE);
return(TRUE);
}
case t_pathname:
#ifdef UNIX
if (equal(x->pn.pn_host, y->pn.pn_host) &&
equal(x->pn.pn_device, y->pn.pn_device) &&
equal(x->pn.pn_directory, y->pn.pn_directory) &&
equal(x->pn.pn_name, y->pn.pn_name) &&
equal(x->pn.pn_type, y->pn.pn_type) &&
equal(x->pn.pn_version, y->pn.pn_version))
#endif
return(TRUE);
else
return(FALSE);
}
return(eql(x,y));
}
DEFUNO("EQUAL",object,fLequal,LISP
,2,2,NONE,OO,OO,OO,OO,Lequal,"")(x0,x1)
object x0,x1;
{
/* 2 args */
if (equal(x0, x1))
x0 = Ct;
else
x0 = Cnil;
vs_pop;
RETURN1(x0);
}
bool
equalp(x, y)
object x, y;
{
enum type tx, ty;
int j;
cs_check(x);
BEGIN:
if (eql(x, y))
return(TRUE);
tx = type_of(x);
ty = type_of(y);
switch (tx) {
case t_fixnum:
case t_bignum:
case t_ratio:
case t_shortfloat:
case t_longfloat:
case t_complex:
if (ty == t_fixnum || ty == t_bignum || ty == t_ratio ||
ty == t_shortfloat || ty == t_longfloat ||
ty == t_complex)
return(!number_compare(x, y));
else
return(FALSE);
case t_vector:
case t_string:
case t_bitvector:
if (ty == t_vector || ty == t_string || ty == t_bitvector)
{ j = x->v.v_fillp;
if (j != y->v.v_fillp)
return FALSE;
goto ARRAY;}
else
return(FALSE);
case t_array:
if (ty == t_array && x->a.a_rank == y->a.a_rank)
{ if (x->a.a_rank > 1)
{int i=0;
for (i=0; i< x->a.a_rank; i++)
{if (x->a.a_dims[i]!=y->a.a_dims[i])
return(FALSE);}}
if (x->a.a_dim != y->a.a_dim)
return(FALSE);
j=x->a.a_dim;
goto ARRAY;}
else
return(FALSE);
}
if (tx != ty)
return(FALSE);
switch (tx) {
case t_character:
return(char_equal(x, y));
case t_cons:
if (!equalp(x->c.c_car, y->c.c_car))
return(FALSE);
x = x->c.c_cdr;
y = y->c.c_cdr;
goto BEGIN;
case t_structure:
{
int i;
if (x->str.str_def != y->str.str_def)
return(FALSE);
{int leng= S_DATA(x->str.str_def)->length;
unsigned char *s_type= & SLOT_TYPE(x->str.str_def,0);
unsigned short *s_pos= & SLOT_POS(x->str.str_def,0);
for (i = 0; i < leng; i++,s_pos++)
{if (s_type[i]==0)
{if (!equalp(STREF(object,x,*s_pos),STREF(object,y,*s_pos)))
return FALSE;}
else
if (! (*s_pos & (sizeof(object)-1)))
switch(s_type[i]){
case aet_lf:
if(STREF(longfloat,x,*s_pos) != STREF(longfloat,y,*s_pos))
return(FALSE);
break;
case aet_sf:
if(STREF(shortfloat,x,*s_pos)!=STREF(shortfloat,y,*s_pos))
return(FALSE);
break;
default:
if(STREF(int,x,*s_pos)!=STREF(int,y,*s_pos))
return(FALSE);
break;}}
return(TRUE);
}}
case t_pathname:
return(equal(x, y));
}
return(FALSE);
ARRAY:
{
int i;
vs_push(Cnil);
vs_push(Cnil);
for (i = 0; i < j; i++) {
vs_top[-2] = aref(x, i);
vs_top[-1] = aref(y, i);
if (!equalp(vs_top[-2], vs_top[-1])) {
vs_pop;
vs_pop;
return(FALSE);
}
}
vs_pop;
vs_pop;
return(TRUE);
}
}
DEFUNO("EQUALP",object,fLequalp,LISP
,2,2,NONE,OO,OO,OO,OO,Lequalp,"")(x0,x1)
object x0,x1;
{
/* 2 args */
if (equalp(x0, x1))
x0 = Ct;
else
x0 = Cnil;
RETURN1(x0);
}
Fand(args)
object args;
{
object endp_temp;
object *top = vs_top;
if (endp(args)) {
vs_base = vs_top;
vs_push(Ct);
return;
}
while (!endp(MMcdr(args))) {
eval(MMcar(args));
if (vs_base[0] == Cnil) {
vs_base = vs_top = top;
vs_push(Cnil);
return;
}
vs_top = top;
args = MMcdr(args);
}
eval(MMcar(args));
}
For(args)
object args;
{
object endp_temp;
object *top = vs_top;
if (endp(args)) {
vs_base = vs_top;
vs_push(Cnil);
return;
}
while (!endp(MMcdr(args))) {
eval(MMcar(args));
if (vs_base[0] != Cnil) {
top[0] = vs_base[0];
vs_base = top;
vs_top = top+1;
return;
}
vs_top = top;
args = MMcdr(args);
}
eval(MMcar(args));
}
/*
Contains_sharp_comma returns TRUE, iff the argument contains
a cons whose car is si:|#,| or a STRUCTURE.
Refer to the compiler about this magic.
*/
bool
contains_sharp_comma(x)
object x;
{
enum type tx;
cs_check(x);
BEGIN:
tx = type_of(x);
if (tx == t_complex)
return(contains_sharp_comma(x->cmp.cmp_real) ||
contains_sharp_comma(x->cmp.cmp_imag));
if (tx == t_vector)
{
int i;
if (x->v.v_elttype == aet_object)
for (i = 0; i < x->v.v_fillp; i++)
if (contains_sharp_comma(x->v.v_self[i]))
return(TRUE);
return(FALSE);
}
if (tx == t_cons) {
if (x->c.c_car == siSsharp_comma)
return(TRUE);
if (contains_sharp_comma(x->c.c_car))
return(TRUE);
x = x->c.c_cdr;
goto BEGIN;
}
if (tx == t_array)
{
int i, j;
if (x->a.a_elttype == aet_object) {
for (i = 0, j = 1; i < x->a.a_rank; i++)
j *= x->a.a_dims[i];
for (i = 0; i < j; i++)
if (contains_sharp_comma(x->a.a_self[i]))
return(TRUE);
}
return(FALSE);
}
if (tx == t_structure)
return(TRUE); /* Oh, my god! */
return(FALSE);
}
DEFUNO("CONTAINS-SHARP-COMMA",object,fScontains_sharp_comma,SI
,1,1,NONE,OO,OO,OO,OO,siLcontains_sharp_comma,"")(x0)
object x0;
{
/* 1 args */
if (contains_sharp_comma(x0))
x0 = Ct;
else
x0 = Cnil;
RETURN1(x0);
}
DEFUNO("SPICEP",object,fSspicep ,SI
,1,1,NONE,OO,OO,OO,OO,siLspicep ,"")(x0)
object x0;
{
/* 1 args */
if (type_of(x0) == t_spice)
x0 = Ct;
else
x0 = Cnil;
RETURN1(x0);
}
DEFUNO("FIXNUMP",object,fSfixnump,SI
,1,1,NONE,OO,OO,OO,OO,siLfixnump,"")(x0)
object x0;
{
/* 1 args */
if (type_of(x0) == t_fixnum)
x0 = Ct;
else
x0 = Cnil;
RETURN1(x0);
}
init_predicate_function()
{
make_special_form("AND",Fand);
make_special_form("OR",For);
}
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.