- if b then execute (SWhile e s) else return ()
-execute (SDecl t i EDefault) = do
- case t of
- TInt -> setVariableValue i (EInt 0)
- TBool -> setVariableValue i (EBool False)
- return ()
-execute (SDecl t i e) = setVariableValue i e >> return ()
+ if b then pushAndPop (execute s) >> execute (SWhile e s) else return ()
+execute (SDeclD t i) = execute $ SDecl t i $ case t of
+ TInt -> EInt 0
+ TBool -> EBool False
+execute (SDecl t i e) =do
+ v <- eval e
+ state <- get
+ let (m:ms) = variables state in modify (\s -> s{variables=insert i v m:ms })
+execute (SReturn e) = do
+ v <- eval e
+ s <- get
+ lift $ putMVar (ret s) v
+ throwError $ userError "Returning.."
+
+addFunction :: (MonadState State m) => Func -> m ()
+addFunction (Func _ i d ss) = modify (\s -> s{functions=insert i (d,ss) (functions s) })