diff options
Diffstat (limited to 'main.scm')
-rw-r--r-- | main.scm | 23 |
1 files changed, 18 insertions, 5 deletions
@@ -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)] |