/
APPLY.LKS
executable file
·62 lines (62 loc) · 2.44 KB
/
APPLY.LKS
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
(LETREC APPLY
(APPLY LAMBDA (FUN ITEMS)
(LET (EVAL (CDR (CAR C))
(CONS (CAR (CAR C)) (CAR (CDR C)))
(CONS ITEMS (CDR (CDR C))))
(C EVAL FUN (QUOTE NIL) (QUOTE NIL))))
(EVAL LAMBDA (E N V)
(IF (ATOM E) (ASSOC E N V)
(IF (EQ (CAR E) (QUOTE QUOTE)) (CAR (CDR E))
(IF (EQ (CAR E) (QUOTE CAR)) (CAR (EVAL (CAR (CDR E)) N V))
(IF (EQ (CAR E) (QUOTE CDR)) (CDR (EVAL (CAR (CDR E)) N V))
(IF (EQ (CAR E) (QUOTE ATOM)) (ATOM (EVAL (CAR (CDR E)) N V))
(IF (EQ (CAR E) (QUOTE CONS))
(CONS (EVAL (CAR (CDR E)) N V) (EVAL (CAR (CDR (CDR E))) N V))
(IF (EQ (CAR E) (QUOTE EQ))
(EQ (EVAL (CAR (CDR E)) N V) (EVAL (CAR (CDR (CDR E))) N V))
(IF (EQ (CAR E) (QUOTE ADD))
(ADD (EVAL (CAR (CDR E)) N V) (EVAL (CAR (CDR (CDR E))) N V))
(IF (EQ (CAR E) (QUOTE IF))
(LET (IF (EVAL TESTPT N V) (EVAL THENPT N V) (EVAL ELSEPT N V))
(TESTPT CAR (CDR E))
(THENPT CAR (CDR (CDR E)))
(ELSEPT CAR (CDR (CDR (CDR E)))))
(IF (EQ (CAR E) (QUOTE LAMBDA))
(CONS (CONS (CAR (CDR E)) (CAR (CDR (CDR E)))) (CONS N V))
(IF (EQ (CAR E) (QUOTE LET))
(LET (EVAL (CAR (CDR E)) (CONS Y N) (CONS Z V))
(Y VARS (CDR (CDR E)))
(Z EVLIS (EXPRS (CDR (CDR E))) N V))
(IF (EQ (CAR E) (QUOTE LETREC))
(LET (LET (EVAL (CAR (CDR E)) (CONS Y N) (RPLACA V1 Z))
(Z EVLIS (EXPRS (CDR (CDR E))) (CONS Y N) V1))
(Y VARS (CDR (CDR E)))
(V1 CONS (QUOTE OMEGA) V))
(LET (EVAL (CDR (CAR C))
(CONS (CAR (CAR C)) (CAR (CDR C)))
(CONS Z (CDR (CDR C))))
(C EVAL (CAR E) N V)
(Z EVLIS (CDR E) N V)))))))))))))))
(ASSOC LAMBDA (X N V)
(LETREC (IF (MEMBER X (CAR N))
(LOCATE X (CAR N) (CAR V))
(ASSOC X (CDR N) (CDR V)))
(LOCATE LAMBDA (X L M)
(IF (EQ X (CAR L))
(CAR M)
(LOCATE X (CDR L) (CDR M))))
(MEMBER LAMBDA (X L)
(IF (EQ L (QUOTE NIL))
(QUOTE F)
(IF (EQ X (CAR L))
(QUOTE T)
(MEMBER X (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)))))
(EVLIS LAMBDA (L N V)
(IF (EQ L (QUOTE NIL)) (QUOTE NIL)
(CONS (EVAL (CAR L) N V) (EVLIS (CDR L) N V))))) &