/* from Zavdi L. Lichtman, "The Function of T and NIL in LISP" Software-- Practice and Experience, Vol. 16(1) pp.1-3, January 1986. evalquote(fn,x) = apply(fn,x,NIL) apply(fn,x,a) = (atom(fn) -> (eq(fn,CAR) -> car(car(x)); eq(fn,CDR) -> cdr(car(x)); eq(fn,CONS) -> cons(car(x),car(cdr(x))); eq(fn,ATOM) -> atom(car(x)); eq(fn,EQ) -> eq(car(x),car(cdr(x))); T -> apply(eval(fn,a),x,a)); eq(car(fn),LAMBDA) -> eval(car(cdr(cdr(fn))),pairlis(car(cdr(fn)),x,a)); eq(car(fn),LABEL) -> apply(car(cdr(cdr(fn))),x,cons(cons(car(cdr(fn)),car(cdr(cdr(fn)))),a)); eq(car(fn),FUNARG) -> apply(car(cdr(fn)),x,car(cdr(cdr(fn))))) eval(e,a) -> (atom(e) -> (eq(e,T) -> T; eq(e,NIL) -> NIL; T -> cdr(assoc(e,a))); atom(car(e)) -> (eq(car(e),QUOTE) -> car(cdr(e)); eq(car(e),COND) -> evcon(cdr(e),a); eq(car(e),FUNCTION) -> cons(FUNARG,cons(car(cdr(e)),cons(a,NIL))); T -> apply(car(e),evlis(cdr(e),a),a)); T -> apply(car(e),evlis(cdr(e),a),a)) pairlis(x,y,a) -> (null(x) -> a; T -> cons(cons(car(x),car(y)),pairlis(cdr(x),cdr(y),a))) assoc(x,a) -> (eq(car(car(a)),x) -> car(a); T -> assoc(x,cdr(a))) evcon(c,a) -> (eval(car(car(c)),a) -> eval(car(cdr(car(c))),a); T -> evcon(cdr(c),a)) evlis(m,a) -> (null(m) -> NIL; T -> cons(eval(car(m),a),evlis(cdr(m),a))) */