123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124 |
- %
- % EQUAL.RED - EQUAL, EQN and friends
- %
- % Author: Eric Benson
- % Symbolic Computation Group
- % Computer Science Dept.
- % University of Utah
- % Date: 19 August 1981
- % Copyright (c) 1981 University of Utah
- %
- % <PSL.KERNEL>EQUAL.RED.2, 21-Sep-82 10:38:28, Edit by BENSON
- % Made HalfWordsEqual, etc. internal
- % EQ is handled by the compiler and is in KNOWN-TO-COMP-SL.RED
- CompileTime flag('(HalfWordsEqual VectorEqual WordsEqual), 'InternalFunction);
- on SysLisp;
- syslsp procedure Eqn(U, V); %. Eq or numeric equality
- U eq V or case Tag U of % add bignums later
- FLTN:
- FloatP V and
- FloatHighOrder FltInf U eq FloatHighOrder FltInf V
- and FloatLowOrder FltInf U eq FloatLowOrder FltInf V;
- FIXN:
- FixNP V and FixVal FixInf U eq FixVal FixInf V;
- BIGN:
- BigP V and WordsEqual(U, V);
- default:
- NIL
- end;
- % Called LispEqual instead of Equal, to avoid name change due to Syslisp parser
- syslsp procedure LispEqual(U, V); %. Structural equality
- U eq V or case Tag U of
- VECT:
- VectorP V and VectorEqual(U, V);
- STR, BYTES:
- StringP V and StringEqual(U, V);
- PAIR:
- PairP V and
- LispEqual(car U, car V) and LispEqual(cdr U, cdr V);
- FLTN:
- FloatP V and
- FloatHighOrder FltInf U eq FloatHighOrder FltInf V
- and FloatLowOrder FltInf U eq FloatLowOrder FltInf V;
- FIXN:
- FixNP V and FixVal FixInf U eq FixVal FixInf V;
- BIGN:
- BigP V and WordsEqual(U, V);
- WRDS:
- WrdsP V and WordsEqual(U, V);
- HalfWords:
- HalfWordsP V and HalfWordsEqual(U, V);
- default:
- NIL
- end;
- syslsp procedure EqStr(U, V); %. Eq or string equality
- U eq V or StringP U and StringP V and StringEqual(U, V);
- syslsp procedure StringEqual(U, V); % EqStr without typechecking or eq
- begin scalar Len, I;
- U := StrInf U;
- V := StrInf V;
- Len := StrLen U;
- if Len neq StrLen V then return NIL;
- I := 0;
- Loop:
- if I > Len then return T;
- if StrByt(U, I) neq StrByt(V, I) then return NIL;
- I := I + 1;
- goto Loop;
- end;
- syslsp procedure WordsEqual(U, V);
- begin scalar S1, I;
- U := WrdInf U;
- V := WrdInf V;
- if not ((S1 := WrdLen U) eq WrdLen V) then return NIL;
- I := 0;
- Loop:
- if I eq S1 then return T;
- if not (WrdItm(U, I) eq WrdItm(V, I)) then return NIL;
- I := I + 1;
- goto Loop;
- end;
- syslsp procedure HalfWordsEqual(U, V);
- begin scalar S1, I;
- U := HalfWordInf U;
- V := HalfWordInf V;
- if not ((S1 := HalfWordLen U) eq HalfWordLen V) then return NIL;
- I := 0;
- Loop:
- if I eq S1 then return T;
- if not (HalfWordItm(U, I) eq HalfWordItm(V, I)) then return NIL;
- I := I + 1;
- goto Loop;
- end;
- syslsp procedure VectorEqual(U, V); % Vector equality without type check
- begin scalar Len, I;
- U := VecInf U;
- V := VecInf V;
- Len := VecLen U;
- if Len neq VecLen V then return NIL;
- I := 0;
- Loop:
- if I > Len then return T;
- if not LispEqual(VecItm(U, I), VecItm(V, I)) then return NIL;
- I := I + 1;
- goto Loop;
- end;
- off SysLisp;
- LoadTime PutD('Equal, 'EXPR, cdr GetD 'LispEqual);
- END;
|