diff options
-rw-r--r-- | environment.scm | 3 | ||||
-rw-r--r-- | main.scm | 23 |
2 files changed, 19 insertions, 7 deletions
diff --git a/environment.scm b/environment.scm index 37f9fa4..d5e606d 100644 --- a/environment.scm +++ b/environment.scm | |||
@@ -29,7 +29,7 @@ | |||
29 | (error "Too few or too many arguments supplied" vars vals))) | 29 | (error "Too few or too many arguments supplied" vars vals))) |
30 | 30 | ||
31 | ;;; variable lookup | 31 | ;;; variable lookup |
32 | (define (is-unassigned? u) (eq? u '*unassigned*)) | 32 | (define (is-unassigned? u) (eq? u ''*unassigned*)) |
33 | (define (lookup-variable-value var env) | 33 | (define (lookup-variable-value var env) |
34 | (cond | 34 | (cond |
35 | [(empty-env? env) (error "Unbound variable" var)] | 35 | [(empty-env? env) (error "Unbound variable" var)] |
@@ -77,6 +77,5 @@ | |||
77 | the-empty-env)]) | 77 | the-empty-env)]) |
78 | (define-variable! 'true #t initial-env) | 78 | (define-variable! 'true #t initial-env) |
79 | (define-variable! 'false #f initial-env) | 79 | (define-variable! 'false #f initial-env) |
80 | (define-variable! '*unassigned* #f initial-env) | ||
81 | initial-env)) | 80 | initial-env)) |
82 | 81 | ||
@@ -71,6 +71,17 @@ | |||
71 | (define (definition? expr) (tagged? expr 'define)) | 71 | (define (definition? expr) (tagged? expr 'define)) |
72 | (define (definition-name expr) (cadr expr)) | 72 | (define (definition-name expr) (cadr expr)) |
73 | (define (definition-value expr) (caddr expr)) | 73 | (define (definition-value expr) (caddr expr)) |
74 | (define (definition-lambda? expr) (pair? (definition-name expr))) | ||
75 | (define (definition-lambda-name expr) (caadr expr)) | ||
76 | (define (definition-lambda-params expr) (cdadr expr)) | ||
77 | (define (definition-lambda-body expr) (cddr expr)) | ||
78 | (define (make-definition name value) (list 'define name value)) | ||
79 | (define (definition->lambda expr) | ||
80 | (let ([name (definition-lambda-name expr)] | ||
81 | [params (definition-lambda-params expr)] | ||
82 | [body (definition-lambda-body expr)]) | ||
83 | (make-definition name | ||
84 | (make-lambda params body)))) | ||
74 | 85 | ||
75 | ;;; lambda | 86 | ;;; lambda |
76 | (define (lambda-form? expr) (tagged? expr 'lambda)) | 87 | (define (lambda-form? expr) (tagged? expr 'lambda)) |
@@ -134,7 +145,7 @@ | |||
134 | statements)) | 145 | statements)) |
135 | (define (make-unassigned-bindings internal-defines) | 146 | (define (make-unassigned-bindings internal-defines) |
136 | (map (lambda (d) | 147 | (map (lambda (d) |
137 | (list (definition-name d) '*unassigned*)) internal-defines)) | 148 | (list (definition-name d) ''*unassigned*)) internal-defines)) |
138 | (define (scan-out-defines body) | 149 | (define (scan-out-defines body) |
139 | (let ([internal-defines (filter definition? body)] | 150 | (let ([internal-defines (filter definition? body)] |
140 | [rest (filter (lambda (n) (not (definition? n))) body)]) | 151 | [rest (filter (lambda (n) (not (definition? n))) body)]) |
@@ -197,10 +208,12 @@ | |||
197 | env)) | 208 | env)) |
198 | 209 | ||
199 | (define (eval-definition expr env) | 210 | (define (eval-definition expr env) |
200 | (define-variable! | 211 | (cond |
201 | (definition-name expr) | 212 | [(definition-lambda? expr) (eval-expr (definition->lambda expr) env)] |
202 | (eval-expr (definition-value expr) env) | 213 | [else (define-variable! |
203 | env)) | 214 | (definition-name expr) |
215 | (eval-expr (definition-value expr) env) | ||
216 | env)])) | ||
204 | 217 | ||
205 | (define (eval-function-application expr env) | 218 | (define (eval-function-application expr env) |
206 | (let ([proc (operator expr)] | 219 | (let ([proc (operator expr)] |