treat global scope as a special late binding

This commit is contained in:
darkf 2013-10-23 02:13:35 -07:00
parent 04c227e0e9
commit 92463a26c7
1 changed files with 5 additions and 2 deletions

View File

@ -142,7 +142,9 @@ eval (Def name v') = do
eval (Lambda pats) =
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 (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
Just fn@(FnV cls _) -> do
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'
put (h,env) -- restore env
return v