|
11 | 11 |
|
12 | 12 | (define (EVAL exp environ) |
13 | 13 | ;; dispatch on expression type |
14 | | - (cond [(number? exp) exp] ; self-evaluating |
15 | | - [(symbol? exp) |
| 14 | + (cond [(number? exp) exp] ; self-evaluating |
| 15 | + [(symbol? exp) ; variable? |
16 | 16 | (LOOKUP-VARIABLE-VALUE exp environ)] |
| 17 | + [(eq? (car exp) 'QUOTE) (cadr exp)] ; quoted? |
| 18 | + ;; rule for procedure objects in the environment model |
| 19 | + [(eq? (car exp) 'LAMBDA) ; lambda? |
| 20 | + (list 'procedure ; make-procedure |
| 21 | + (cadr exp) ; lambda-parameters |
| 22 | + (caddr exp) ; lambda-body |
| 23 | + environ)] |
| 24 | + [(eq? (car exp) 'IF) ; if? |
| 25 | + (EVAL-IF exp environ)] |
17 | 26 | [else |
18 | | - (apply (EVAL (car exp) environ) ; operator |
19 | | - (LIST-OF-VALUES (cdr exp) ; operands |
| 27 | + (APPLY (EVAL (car exp) environ) ; operator |
| 28 | + (LIST-OF-VALUES (cdr exp) ; operands |
20 | 29 | environ))])) |
21 | 30 |
|
| 31 | +(define (APPLY procedure arguments) |
| 32 | + ;; dispatch on procedure type |
| 33 | + (cond [(and (list? procedure) (eq? (car procedure) 'procedure)) ; compoud-procedure? |
| 34 | + (EVAL |
| 35 | + (caddr procedure) ; procedure-body |
| 36 | + (EXTEND-ENVIRONMENT |
| 37 | + (cadr procedure) ; procedure-parameters |
| 38 | + arguments |
| 39 | + (cadddr procedure)))] ; procedure-environment |
| 40 | + [else (apply procedure arguments)])) ; (apply ...) from host interpreter |
22 | 41 |
|
23 | 42 | (define (LIST-OF-VALUES exps environ) |
24 | 43 | (if (null? exps) |
25 | 44 | '() |
26 | 45 | (cons (EVAL (car exps) environ) |
27 | 46 | (LIST-OF-VALUES (cdr exps) environ)))) |
28 | 47 |
|
| 48 | +(define (EVAL-IF exp environ) |
| 49 | + (if (EVAL (cadr exp) environ) ; if-predicate |
| 50 | + (EVAL (caddr exp) environ) ; if-consequent |
| 51 | + (EVAL (cadddr exp) environ))) ; if-alternative |
| 52 | + |
29 | 53 | (define (EXTEND-ENVIRONMENT vars values base-environ) |
30 | 54 | (cons (MAKE-FRAME vars values) base-environ)) |
31 | 55 |
|
|
52 | 76 |
|
53 | 77 | (define (MAKE-BUILTINS) |
54 | 78 | (EXTEND-ENVIRONMENT |
55 | | - '(+ - * /) |
56 | | - (list + - * /) |
| 79 | + '(+ - * / <) |
| 80 | + (list + - * / <) |
57 | 81 | '())) |
58 | 82 |
|
59 | 83 | ; Needed to support rackunit tests in concrete-test.rkt. |
|
0 commit comments