![]() |
pLISP © '98 Thomas Mahler |
// load the secd compiler, defines toplevel function COMPILE
(load "secd-compiler.html")
// set printing flags to allow complete output
(printdepth 500)
(printlength 500)
// Assign Source Code of LISPKIT Compiler to Variable LISPKIT-SOURCE
(setq LISPKIT-SOURCE
'(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))))))
))
// Compile Source Code and assign result to variable LISPKIT-OBJECT-CODE
(setq LISPKIT-OBJECT-CODE (COMPILE LISPKIT-SOURCE))
// Output Result
(print (pp LISPKIT-OBJECT-CODE))