+type EvalM m = ErrorT String m
+
+interpret :: [Func] -> [Stm] -> IO ()
+interpret fun st = do
+ runStateT (runErrorT (do mapM addFunction fun; mapM_ execute st)) emptyState
+ return ()
+
+--eval :: (MonadState State m, MonadError String m, MonadIO m) => Exp -> m Value
+eval :: (MonadState State m, MonadIO m) => Exp -> EvalM m Value