diff --git a/Final/1.rkt b/Final/1.rkt index d0b89f7..11c768b 100644 --- a/Final/1.rkt +++ b/Final/1.rkt @@ -32,7 +32,14 @@ (interp bound-body (extend env bound-id (interp named-expr env)))] [(varE name) (lookup name env)] [(lamE bound-id bound-body) (lamV bound-id bound-body env)] - [(callWith with-id with-expr fun-expr arg-expr) ....] + ; Wordy double extend, as first setting up the f-env with the value it is dynamically scoped with. + ; Then, extending that environment with the function that is being used on the value. + [(callWith with-id with-expr fun-expr arg-expr) + (let ([fval (interp fun-expr env)]) + (type-case Value fval + [(lamV bound-id bound-body f-env) + (interp bound-body (extend (extend f-env with-id (interp with-expr env)) bound-id (interp arg-expr env)))] + [else (error 'interp "non-function")]))] [(appE fun-expr arg-expr) (let ([fval (interp fun-expr env)]) (type-case Value fval