home *** CD-ROM | disk | FTP | other *** search
- (*******************************************************)
- (* LISP.PAS *)
- (* Include-Modul des LittleLisp-Systems *)
- (* (C) 1988 Reinhard Häring & TOOLBOX *)
- (*******************************************************)
-
-
- PROCEDURE error(n:lstring);
- BEGIN
- WriteLn('Internal Error --- ',n);
- END;
-
- FUNCTION car(x:objp):objp;
- BEGIN
- IF x^.typ<>3 THEN
- error('car of atom or integer: '+outlist(x))
- ELSE car:=x^.o.car;
- END;
-
- FUNCTION cdr(x:objp):objp;
- BEGIN
- IF x^.typ<>3 THEN
- error('cdr of atom or integer :'+outlist(x))
- ELSE cdr:=x^.o.cdr;
- END;
-
- FUNCTION cons(a,b:objp):objp;
- VAR o:objp;
- BEGIN
- New(o);
- o^.typ:=3; o^.o.car:=a; o^.o.cdr:=b; cons:=o;
- END;
-
- FUNCTION equal(a,b:objp):BOOLEAN;
- BEGIN equal:=FALSE;
- IF a^.typ=b^.typ THEN
- CASE a^.typ OF
- -1:equal:=TRUE;
- 0:equal:=a^.i=b^.i;
- 1:equal:=a^.s^=b^.s^;
- 2:equal:=a^.a^=b^.a^;
- 3:equal:= equal(a^.o.car,b^.o.car)
- AND equal(a^.o.cdr,b^.o.cdr);
- ELSE error('Unknown Type in Equal');
- END;
- END;
-
- FUNCTION eq(a,b:objp):BOOLEAN;
- BEGIN eq:=FALSE;
- IF a^.typ=b^.typ THEN
- CASE a^.typ OF
- -1:eq:=TRUE;
- 0:eq:=a^.i=b^.i;
- 1:eq:=a^.s^=b^.s^;
- 2:eq:=a^.a^=b^.a^;
- 3:eq:= a=b;
- ELSE error('Unknown Type in Eq');
- END;
- END;
-
-
- FUNCTION nullp(x:objp):BOOLEAN;
- BEGIN nullp:=-1=x^.typ; END;
-
- FUNCTION assoc(a,list:objp):objp;
- BEGIN
- IF list^.typ=-1 THEN assoc:=null ELSE
- IF list^.typ<>3 THEN
- error('Not an AList in assoc: '+outlist(list))
- ELSE BEGIN
- IF equal(a,car(car(list))) THEN assoc:=car(list)
- ELSE assoc:=assoc(a,cdr(list))
- END; END;
-
- FUNCTION member(a,l:objp):BOOLEAN;
- BEGIN
- IF nullp(l) THEN member:=FALSE ELSE
- IF 3<>l^.typ THEN member:=FALSE ELSE
- IF equal(car(l),a) THEN member:=TRUE ELSE
- member:=member(a,cdr(l));
- END;
-
- FUNCTION llen(a:objp):INTEGER;
- BEGIN
- IF nullp(a) THEN llen:=0 ELSE
- IF a^.typ<>3 THEN
- error('no list for length: '+outlist(a)) ELSE
- llen:=1+llen(cdr(a));
- END;
-
- FUNCTION append(a,b:objp):objp;
- BEGIN
- IF nullp(a) THEN append:=b ELSE
- IF nullp(b) THEN append:=a ELSE
- IF a^.typ<>3 THEN
- error('no list for append: '+outlist(a))
- ELSE IF b^.typ<>3 THEN
- error('no list for append: '+outlist(b))
- ELSE
- append:=cons(car(a),append(cdr(a),b));
- END;
-
- FUNCTION setcar(list,newcar:objp):objp;
- BEGIN
- IF list^.typ<>3 THEN
- error('setcars argument is no pair: '+outlist(list))
- ELSE BEGIN
- list^.o.car:=newcar;
- setcar:=list;
- END;
- END;
-
- FUNCTION setcdr(list,newcdr:objp):objp;
- BEGIN
- IF list^.typ<>3 THEN
- error('setcdrs argument is no pair: '+outlist(list))
- ELSE BEGIN
- list^.o.cdr:=newcdr;
- setcdr:=list;
- END;
- END;
-
- FUNCTION make_number(a:INTEGER):objp;
- VAR o:objp;
- BEGIN
- New(o);
- o^.typ:=0; o^.i:=a; make_number:=o;
- END;
-