|
153 | 153 | (let* ([arg (fun-formal e)]
|
154 | 154 | [body (fun-body e)]
|
155 | 155 | [s (free-vars-helper body)]
|
156 |
| - [freevars (set-remove (cdr s) arg)]) |
| 156 | + [freevars (set-remove (set-remove (cdr s) arg) (fun-nameopt e))]) |
157 | 157 | (cons (fun-challenge (fun-nameopt e) arg (car s) freevars) freevars))]
|
158 | 158 | [(var? e)
|
159 | 159 | (cons e (set (var-string e)))]
|
|
216 | 216 |
|
217 | 217 |
|
218 | 218 | (define (eval-under-env-c e env)
|
219 |
| - (println e) |
220 |
| - (println env) |
221 | 219 | (cond [(var? e)
|
222 | 220 | (envlookup env (var-string e))]
|
223 | 221 | [(add? e)
|
|
233 | 231 | [(closure? e) e]
|
234 | 232 | [(aunit? e) e]
|
235 | 233 | [(fun-challenge? e)
|
236 |
| - (let ([f-name (fun-challenge-nameopt e)] |
237 |
| - [result (closure env e)]) |
238 |
| - (if (string? f-name) |
239 |
| - (closure (cons (cons f-name result) env) e) |
240 |
| - result))] |
| 234 | + (let* ([freevars (fun-challenge-freevars e)] |
| 235 | + [result (closure (compute-env env freevars) e)]) |
| 236 | + result)] |
241 | 237 | [(ifgreater? e)
|
242 | 238 | (let ([v1 (eval-under-env-c (ifgreater-e1 e) env)]
|
243 | 239 | [v2 (eval-under-env-c (ifgreater-e2 e) env)])
|
|
254 | 250 | (eval-under-env-c (mlet-body e) (cons (cons name val) env)))
|
255 | 251 | (error "MUPL variable name has to be string"))]
|
256 | 252 | [(call? e)
|
257 |
| - (let* ([clojure (let ([clojure (eval-under-env-c (call-funexp e) env)]) |
| 253 | + (let* ([fn-call (call-funexp e)] |
| 254 | + [clojure (let ([clojure (eval-under-env-c (call-funexp e) env)]) |
258 | 255 | (if (closure? clojure) clojure (error "MUPL call applied to non-function")))]
|
| 256 | + [fn-name (if (var? fn-call) |
| 257 | + (var-string fn-call) |
| 258 | + (fun-challenge-nameopt fn-call))] |
259 | 259 | [arg (eval-under-env-c (call-actual e) env)]
|
260 | 260 | [fn (closure-fun clojure)]
|
261 |
| - [envi (let ([fn-call (call-funexp e)] |
262 |
| - [clojure-env (closure-env clojure)]) |
263 |
| - (if (var? fn-call) |
264 |
| - (cons (cons (var-string fn-call) clojure) clojure-env) ;; Add bindings for recursive call |
265 |
| - clojure-env))] |
266 |
| - [reduced-envi (compute-env envi (fun-challenge-freevars fn))] |
267 | 261 | [arg-name (fun-challenge-formal fn)]
|
268 | 262 | [fn-body (fun-challenge-body fn)])
|
269 |
| - (eval-under-env-c fn-body (cons (cons arg-name arg) reduced-envi)))] |
| 263 | + (eval-under-env-c fn-body (cons (cons fn-name clojure) (cons (cons arg-name arg) (closure-env clojure)))))] |
270 | 264 | [(apair? e)
|
271 | 265 | (apair (eval-under-env-c (apair-e1 e) env) (eval-under-env-c (apair-e2 e) env))]
|
272 | 266 | [(fst? e) (let ([pair (eval-under-env-c (fst-e e) env)])
|
|
0 commit comments