Skip to content

Commit ee163c5

Browse files
super zozosuper zozo
super zozo
authored and
super zozo
committedJul 11, 2018
update hw5
1 parent ca46fed commit ee163c5

File tree

1 file changed

+10
-16
lines changed

1 file changed

+10
-16
lines changed
 

‎hw5.rkt

+10-16
Original file line numberDiff line numberDiff line change
@@ -153,7 +153,7 @@
153153
(let* ([arg (fun-formal e)]
154154
[body (fun-body e)]
155155
[s (free-vars-helper body)]
156-
[freevars (set-remove (cdr s) arg)])
156+
[freevars (set-remove (set-remove (cdr s) arg) (fun-nameopt e))])
157157
(cons (fun-challenge (fun-nameopt e) arg (car s) freevars) freevars))]
158158
[(var? e)
159159
(cons e (set (var-string e)))]
@@ -216,8 +216,6 @@
216216

217217

218218
(define (eval-under-env-c e env)
219-
(println e)
220-
(println env)
221219
(cond [(var? e)
222220
(envlookup env (var-string e))]
223221
[(add? e)
@@ -233,11 +231,9 @@
233231
[(closure? e) e]
234232
[(aunit? e) e]
235233
[(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)]
241237
[(ifgreater? e)
242238
(let ([v1 (eval-under-env-c (ifgreater-e1 e) env)]
243239
[v2 (eval-under-env-c (ifgreater-e2 e) env)])
@@ -254,19 +250,17 @@
254250
(eval-under-env-c (mlet-body e) (cons (cons name val) env)))
255251
(error "MUPL variable name has to be string"))]
256252
[(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)])
258255
(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))]
259259
[arg (eval-under-env-c (call-actual e) env)]
260260
[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))]
267261
[arg-name (fun-challenge-formal fn)]
268262
[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)))))]
270264
[(apair? e)
271265
(apair (eval-under-env-c (apair-e1 e) env) (eval-under-env-c (apair-e2 e) env))]
272266
[(fst? e) (let ([pair (eval-under-env-c (fst-e e) env)])

0 commit comments

Comments
 (0)