Advertisement
Guest User

Untitled

a guest
Apr 25th, 2019
72
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. preDeclFunctions :: forall (m :: * -> *) => [TopDef] -> TypeEnv -> m TypeEnv
  2. preDeclFunctions [] env = return env
  3. preDeclFunctions (FnDef t (Ident f) args block:funcs) env = do
  4.   let mt = M.lookup f env
  5.   if isNothing mt
  6.     then preDeclFunctions funcs (M.insert f (typeFromArgs args (transType t)) env)
  7.     else trace ("error in preDeclFunctions") $ throwError defaultErr
  8.  
  9. typeFromArgs :: [Arg] -> Types -> Types
  10. typeFromArgs [] t = t
  11. typeFromArgs (ArgByVal a _:args) t = transType a :->: typeFromArgs args t
  12. typeFromArgs (ArgByVar a _:args) t = transType a :->: typeFromArgs args t
  13.  
  14. checkTopDef :: TopDef -> S ()
  15. checkTopDef (FnDef t (Ident f) args block) = do
  16.   env <- ask
  17.   let mt = M.lookup f env
  18.   if isNothing mt
  19.     then trace ("error in checkTopDef") $ throwError defaultErr
  20.     else local (M.insert "" (transType t)) funcWithDecls
  21.   where
  22.     funcWithDecls = checkBlock (concatBlocks (declFromArgs args) block)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement