treat global scope as a special late binding
This commit is contained in:
parent
04c227e0e9
commit
92463a26c7
|
@ -142,7 +142,9 @@ eval (Def name v') = do
|
||||||
|
|
||||||
eval (Lambda pats) =
|
eval (Lambda pats) =
|
||||||
get >>= \(_,env) ->
|
get >>= \(_,env) ->
|
||||||
return $ FnV env pats
|
if length env == 1 then -- if in global env just use [], denoting the current global scope
|
||||||
|
return $ FnV [] pats
|
||||||
|
else return $ FnV env pats
|
||||||
|
|
||||||
eval (Add l r) = do { l <- eval l; r <- eval r; return $ l +$ r }
|
eval (Add l r) = do { l <- eval l; r <- eval r; return $ l +$ r }
|
||||||
eval (Sub l r) = do { l <- eval l; r <- eval r; return $ l -$ r }
|
eval (Sub l r) = do { l <- eval l; r <- eval r; return $ l -$ r }
|
||||||
|
@ -153,7 +155,8 @@ eval (Call name arg) = get >>= \(h,env) ->
|
||||||
case lookup env name of
|
case lookup env name of
|
||||||
Just fn@(FnV cls _) -> do
|
Just fn@(FnV cls _) -> do
|
||||||
arg' <- eval arg
|
arg' <- eval arg
|
||||||
put (h,cls) -- enter closure env
|
let cls' = if cls == [] then [last env] else cls -- if [], use current global env
|
||||||
|
put (h,cls') -- enter closure env
|
||||||
v <- apply fn arg'
|
v <- apply fn arg'
|
||||||
put (h,env) -- restore env
|
put (h,env) -- restore env
|
||||||
return v
|
return v
|
||||||
|
|
Loading…
Reference in New Issue