(SETQ ILISP @(EVALQUOTE1 APPLY1
                        LAM1
                        APP2
                        NULL*
                        LAM2
                        APP3
                        LAMS
                        UNFLICT
                        APPLY2
                        APPLY3
                        APPLY4
                        EVAL1
                        EVCON1
                        PAIRLIS
                        EVLIS1
                        SUBST1
                        SEARCH
                        SUBLIS
                        GENSYM
                        CSYM
                        CSYM#
                        CSYM$))

(DEFPROP EVALQUOTE1
(LAMBDA (FN X) (APPLY1 FN X NIL))
EXPR)

(DEFPROP APPLY1
(LAMBDA (FN X A)
 (COND
  ((ATOM FN)
   (COND
    ((GET FN EXPR) (APPLY1 (GET FN EXPR) X A))
    ((EQ FN CAR)
     (COND ((NULL* (CAR X)) CAR)
           ((LAM1 (CAR X)) (APP2 X CAR))
           (T (CAAR X))))
    ((EQ FN CDR)
     (COND ((NULL* (CAR X)) CDR)
           ((LAM1 (CAR X)) (APP2 X CDR))
           (T (CDAR X))))
    ((EQ FN CONS)
     (COND ((LAM2 X) (APP3 X A CONS)) (T (CONS (CAR X) (CADR X)))))
    ((EQ FN ATOM)
     (COND ((NULL* (CAR X)) ATOM)
           ((LAM1 (CAR X)) (APP2 X ATOM))
           (T (ATOM (CAR X)))))
    ((EQ FN EQ)
     (COND ((LAM2 X) (APP3 X A EQ)) (T (EQ (CAR X) (CADR X)))))
    (T (ERROR (LIST @APPLY1 FN X A)))))
  ((EQ (CAR FN) LAMBDA)
   (APPLY2 (LAMS (CONS LAMBDA (UNFLICT (CDR FN))) X) A))
  (T (ERROR (LIST @APPLY1 FN X A)))))
EXPR)

(DEFPROP LAM1
(LAMBDA (X) (AND (NOT (ATOM X)) (EQ (CAR X) LAMBDA)))
EXPR)

(DEFPROP APP2
(LAMBDA (X A) (LIST (CAAR X) (CADAR X) (LIST A (CADDAR X))))
EXPR)

(DEFPROP NULL*
(LAMBDA (X) (EQ X @NIL*))
EXPR)

(DEFPROP LAM2
(LAMBDA (X) (OR (MEMBER @NIL* X) (LAM1 (CAR X)) (LAM1 (CADR X))))
EXPR)

(DEFPROP APP3
(LAMBDA (X A F)
 ((LAMBDA (U V) (APPLY1 (LIST LAMBDA (LIST U V) (LIST F U V)) X A))
  (GENSYM)
  (GENSYM)))
EXPR)

(DEFPROP LAMS
(LAMBDA (FN X)
 (PROG (VAR1 ARG1 VARS ARGS ARG2 M L)
       (SETQ M (CADDR FN))
       (SETQ ARGS X)
       (SETQ VARS (CADR FN))
  LOOP (SETQ L (CAR ARGS))
       (COND ((LAM1 L) (GO FLICT)))
       (SETQ VAR1 (CONS (CAR VARS) VAR1))
       (SETQ ARG1 (CONS L ARG1))
  LOOP1(SETQ VARS (CDR VARS))
       (COND
        ((NULL VARS)
         (RETURN (LIST (REVERSE VAR1) M (REVERSE ARG1)))))
       (SETQ ARGS (CDR ARGS))
       (GO LOOP)
  FLICT(SETQ L (UNFLICT (CDR L)))
       (SETQ ARG2 (CAR L))
  LOOP2(SETQ VAR1 (CONS (CAR ARG2) VAR1))
       (SETQ ARG1 (CONS @NIL* ARG1))
       (SETQ ARG2 (CDR ARG2))
       (COND (ARG2 (GO LOOP2)))
       (SETQ M (SUBST (CADR L) (CAR VARS) M))
       (GO LOOP1)))
EXPR)

(DEFPROP UNFLICT
(LAMBDA (Y)
 (PROG (L)
       (SETQ L (CAR Y))
  LOOP (COND ((NULL L) (RETURN Y)))
       (SETQ Y (SUBST (GENSYM) (CAR L) Y))
       (SETQ L (CDR L))
       (GO LOOP)))
EXPR)

(DEFPROP APPLY2
(LAMBDA (L A)
 (COND ((MEMBER @NIL* (CADDR L)) (APPLY3 L A))
       (T (EVAL1 (CADR L) (PAIRLIS (CAR L) (CADDR L) A)))))
EXPR)

(DEFPROP APPLY3
(LAMBDA (L A)
 (SEARCH (CADDR L)
         (FUNCTION (LAMBDA (J) (NOT (EQ (CAR J) @NIL*))))
         (FUNCTION (LAMBDA (J) (APPLY4 L A)))
         (FUNCTION (LAMBDA (J) (LIST LAMBDA (CAR L) (CADR L))))))
EXPR)

(DEFPROP APPLY4
(LAMBDA (L A)
 (PROG (VARS FORM ARGS M ARG1)
       (SETQ VARS (CAR L))
       (SETQ FORM (CADR L))
       (SETQ ARGS (CADDR L))
  LOOP (SETQ ARG1 (CAR ARGS))
       (COND ((EQ ARG1 @NIL*) (GO B)))
       (SETQ FORM (SUBST (LIST QUOTE ARG1) (CAR VARS) FORM))
  LOOP1(SETQ ARGS (CDR ARGS))
       (COND ((NULL ARGS) (RETURN (LIST LAMBDA M FORM))))
       (SETQ VARS (CDR VARS))
       (GO LOOP)
  B    (SETQ M (CONS (CAR VARS) M))
       (GO LOOP1)))
EXPR)

(DEFPROP EVAL1
(LAMBDA (E A)
 (COND
  ((ATOM E)
   (COND ((ERRSET (EVAL E) NIL) (EVAL E))
         ((EQ E @NIL*) @NIL*)
         (T (CDR (ASSOC E A)))))
  ((ATOM (CAR E))
   (COND ((EQ (CAR E) QUOTE) (CADR E))
         ((EQ (CAR E) COND) (EVCON1 (CDR E) A))
         ((EQ (CAR E) LAMBDA) E)
         (T (APPLY1 (CAR E) (EVLIS1 (CDR E) A) A))))
  (T (APPLY1 (CAR E) (EVLIS1 (CDR E) A) A))))
EXPR)

(DEFPROP EVCON1
(LAMBDA (C A)
 ((LAMBDA (X)
   (COND
    ((LAM1 X)
     (LIST (CAR X)
           (CADR X)
           (CONS COND (CONS (LIST (CADDR X) (CADAR C)) (CDR C)))))
    ((EVAL1 X A) (EVAL1 (CADAR C) A))
    (T (EVCON1 (CDR C) A))))
  (CAAR C)))
EXPR)

(DEFPROP PAIRLIS
(LAMBDA (X Y A)
 (COND
  ((NULL X) A)
  (T (CONS (CONS (CAR X) (CAR Y)) (PAIRLIS (CDR X) (CDR Y) A)))))
EXPR)

(DEFPROP EVLIS1
(LAMBDA (M A)
 (COND ((NULL M) NIL)
       (T (CONS (EVAL1 (CAR M) A) (EVLIS1 (CDR M) A)))))
EXPR)

(DEFPROP SUBST1
(LAMBDA (X Y Z)
 (COND ((ATOM Z) (COND ((EQ Z Y) X) (T Z)))
       (T (CONS (SUBST1 X Y (CAR Z)) (SUBST1 X Y (CDR Z))))))
EXPR)

(DEFPROP SEARCH
(LAMBDA (%L %F1 %F2 %F3)
   L    ((ATOM %L) (RETURN (%F3 %L)))
        (COND ((%F1 %L) (RETURN (%F2 %L))))
        (SETQ %L (CDR %L))
        (GO L))
EXPR)

(DEFPROP SUBLIS
(LAMBDA (X Y)
 (COND
  ((NULL X) Y)
  ((NULL Y) Y)
  ((SEARCH
    X
    (FUNCTION (LAMBDA (J) (EQUAL Y (CAAR J))))
    (FUNCTION (LAMBDA (J) (CDAR J)))
    (FUNCTION
     (LAMBDA (J)
      (COND ((ATOM Y) Y)
            ((CONS (SUBLIS X (CAR Y)) (SUBLIS X (CDR Y)))))))))))
EXPR)

(DEFPROP GENSYM
(LAMBDA (BASE)
        (SETQ BASE 12)
        (SETQ CSYM# (ADD1 CSYM#))
        (RETURN (MAKNAM (APPEND CSYM$ (#EXPLODEC CSYM#)))))
EXPR)

(DEFPROP CSYM
(LAMBDA (X Y) (SETQ CSYM$ (#EXPLODEC X)) (SETQ CSYM# Y))
EXPR)

(SETQ CSYM# @0)

(SETQ CSYM$ @(107))