compiler.lisp

(LETREC COMPILE
  (COMPILE LAMBDA (E)
    (COMP E (QUOTE NIL) (QUOTE (4 21))))
  (COMP LAMBDA (E N C)
    (IF (ATOM E)
        (CONS (QUOTE 1) (CONS (LOCATION E N) C))
    (IF (EQ (CAR E) (QUOTE QUOTE))
        (CONS (QUOTE 2) (CONS (CAR (CDR E)) C))
    (IF (EQ (CAR E) (QUOTE ADD))
        (COMP (CAR (CDR E)) N (COMP (CAR (CDR (CDR E))) N (CONS (QUOTE 15) C)))
    (IF (EQ (CAR E) (QUOTE SUB))
        (COMP (CAR (CDR E)) N (COMP (CAR (CDR (CDR E))) N (CONS (QUOTE 16) C)))
    (IF (EQ (CAR E) (QUOTE MUL))
        (COMP (CAR (CDR E)) N (COMP (CAR (CDR (CDR E))) N (CONS (QUOTE 17) C)))
    (IF (EQ (CAR E) (QUOTE DIV))
        (COMP (CAR (CDR E)) N (COMP (CAR (CDR (CDR E))) N (CONS (QUOTE 18) C)))
    (IF (EQ (CAR E) (QUOTE REM))
        (COMP (CAR (CDR E)) N (COMP (CAR (CDR (CDR E))) N (CONS (QUOTE 19) C)))
    (IF (EQ (CAR E) (QUOTE LEQ))
        (COMP (CAR (CDR E)) N (COMP (CAR (CDR (CDR E))) N (CONS (QUOTE 20) C)))
    (IF (EQ (CAR E) (QUOTE EQ))
        (COMP (CAR (CDR E)) N (COMP (CAR (CDR (CDR E))) N (CONS (QUOTE 14) C)))
    (IF (EQ (CAR E) (QUOTE CAR))
        (COMP (CAR (CDR E)) N (CONS (QUOTE 10) C))
    (IF (EQ (CAR E) (QUOTE CDR))
        (COMP (CAR (CDR E)) N (CONS (QUOTE 11) C))
    (IF (EQ (CAR E) (QUOTE ATOM))
        (COMP (CAR (CDR E)) N (CONS (QUOTE 12) C))
    (IF (EQ (CAR E) (QUOTE CONS))
        (COMP (CAR (CDR (CDR E))) N (COMP (CAR (CDR E)) N (CONS (QUOTE 13) C)))
    (IF (EQ (CAR E) (QUOTE IF))
        (LET (COMP (CAR (CDR E)) N (CONS (QUOTE 8)
                                    (CONS THENPT (CONS ELSEPT C))))
          (THENPT COMP (CAR (CDR (CDR E))) N (QUOTE (9)))
          (ELSEPT COMP (CAR (CDR (CDR (CDR E)))) N (QUOTE (9))) )
    (IF (EQ (CAR E) (QUOTE LAMBDA))
        (LET (CONS (QUOTE 3) (CONS BODY C))
          (BODY COMP (CAR (CDR (CDR E))) (CONS (CAR (CDR E)) N)
                                    (QUOTE (5))) )
    (IF (EQ (CAR E) (QUOTE LET))
        (LET (LET (COMPLIS ARGS N (CONS (QUOTE 3)
                           (CONS BODY (CONS (QUOTE 4) C))))
               (BODY COMP (CAR (CDR E)) M (QUOTE (5))))
           (M CONS (VARS (CDR (CDR E))) N)
           (ARGS EXPRS (CDR (CDR E))))
    (IF (EQ (CAR E) (QUOTE LETREC))
        (LET (LET (CONS (QUOTE 6) (COMPLIS ARGS M
                         (CONS (QUOTE 3) (CONS BODY (CONS (QUOTE 7) C)))))
               (BODY COMP (CAR (CDR E)) M (QUOTE (5))))
          (M CONS (VARS (CDR (CDR E))) N)
          (ARGS EXPRS (CDR (CDR E))))
    (COMPLIS (CDR E) N (COMP (CAR E) N (CONS (QUOTE 4) C)))))))))))))))))))))
  (COMPLIS LAMBDA (E N C)
    (IF (EQ E (QUOTE NIL)) (CONS (QUOTE 2) (CONS (QUOTE NIL) C))
        (COMPLIS (CDR E) N (COMP (CAR E) N (CONS (QUOTE 13) C)))))
  
  (LOCATION LAMBDA (E N)
    (LETREC
      (IF (MEMBER E (CAR N)) (CONS (QUOTE 0) (POSN E (CAR N)))
          (INCAR (LOCATION E (CDR N))))
    (MEMBER LAMBDA (E N)
          (IF (EQ N (QUOTE NIL)) (QUOTE F)
          (IF (EQ E (CAR N)) (QUOTE T) (MEMBER E (CDR N)))))
    (POSN LAMBDA (E N)
      (IF (EQ E (CAR N)) (QUOTE 0) (ADD (QUOTE 1) (POSN E (CDR N)))))
    (INCAR LAMBDA (L) (CONS (ADD (QUOTE 1) (CAR L)) (CDR L)))))
  (VARS LAMBDA (D)
    (IF (EQ D (QUOTE NIL)) (QUOTE NIL)
        (CONS (CAR (CAR D)) (VARS (CDR D)))))
  (EXPRS LAMBDA (D)
    (IF (EQ D (QUOTE NIL)) (QUOTE NIL)
        (CONS (CDR (CAR D)) (EXPRS (CDR D)))))