1module IRTS.Simplified where
3import IRTS.Defunctionalise
6import Control.Monad.State
10-- Simplified expressions, where functions/constructors can only be applied
14 | SApp Bool Name [LVar]
17 | SCon Int Name [LVar]
21 | SForeign FLang FType String [(FType, LVar)]
23 | SNothing -- erased value, will never be inspected
27data SAlt = SConCase Int Int Name [Name] SExp
28 | SConstCase Const SExp
32data SDecl = SFun Name [Name] Int SExp
35hvar :: State (DDefs, Int) Int
36hvar = do (l, h) <- get
40ldefs :: State (DDefs, Int) DDefs
41ldefs = do (l, h) <- get
44simplify :: Bool -> DExp -> State (DDefs, Int) SExp
45simplify tl (DV (Loc i)) = return (SV (Loc i))
46simplify tl (DV (Glob x))
48 case lookupCtxt Nothing x ctxt of
49 [DConstructor _ t 0] -> return $ SCon t x []
50 _ -> return $ SV (Glob x)
51simplify tl (DApp tc n args) = do args' <- mapM sVar args
52 mkapp (SApp (tl || tc) n) args'
53simplify tl (DForeign lang ty fn args)
54 = do args' <- mapM sVar (map snd args)
55 let fargs = zip (map fst args) args'
56 mkfapp (SForeign lang ty fn) fargs
57simplify tl (DLet n v e) = do v' <- simplify False v
59 return (SLet (Glob n) v' e')
60simplify tl (DUpdate n e) = do e' <- simplify False e
61 return (SUpdate (Glob n) e')
62simplify tl (DC i n args) = do args' <- mapM sVar args
63 mkapp (SCon i n) args'
64simplify tl (DProj t i) = do v <- sVar t
66 (x, Nothing) -> return (SProj x i)
68 return (SLet (Glob x) e (SProj (Glob x) i))
69simplify tl (DCase e alts) = do v <- sVar e
70 alts' <- mapM (sAlt tl) alts
72 (x, Nothing) -> return (SCase x alts')
74 return (SLet (Glob x) e (SCase (Glob x) alts'))
75simplify tl (DConst c) = return (SConst c)
76simplify tl (DOp p args) = do args' <- mapM sVar args
78simplify tl DNothing = return SNothing
79simplify tl (DError str) = return $ SError str
83 case lookupCtxt Nothing x ctxt of
84 [DConstructor _ t 0] -> sVar (DC t x [])
85 _ -> return (Glob x, Nothing)
86sVar (DV x) = return (x, Nothing)
87sVar e = do e' <- simplify False e
89 return (Glob (MN i "R"), Just e')
91mkapp f args = mkapp' f args [] where
92 mkapp' f [] args = return $ f (reverse args)
93 mkapp' f ((x, Nothing) : xs) args = mkapp' f xs (x : args)
94 mkapp' f ((x, Just e) : xs) args
95 = do sc <- mkapp' f xs (x : args)
98mkfapp f args = mkapp' f args [] where
99 mkapp' f [] args = return $ f (reverse args)
100 mkapp' f ((ty, (x, Nothing)) : xs) args = mkapp' f xs ((ty, x) : args)
101 mkapp' f ((ty, (x, Just e)) : xs) args
102 = do sc <- mkapp' f xs ((ty, x) : args)
105sAlt tl (DConCase i n args e) = do e' <- simplify tl e
106 return (SConCase (-1) i n args e')
107sAlt tl (DConstCase c e) = do e' <- simplify tl e
108 return (SConstCase c e')
109sAlt tl (DDefaultCase e) = do e' <- simplify tl e
110 return (SDefaultCase e')
112checkDefs :: DDefs -> [(Name, DDecl)] -> TC [(Name, SDecl)]
113checkDefs ctxt [] = return []
114checkDefs ctxt (con@(n, DConstructor _ _ _) : xs)
115 = do xs' <- checkDefs ctxt xs
117checkDefs ctxt ((n, DFun n' args exp) : xs)
118 = do let sexp = evalState (simplify True exp) (ctxt, 0)
119 (exp', locs) <- runStateT (scopecheck ctxt (zip args [0..]) sexp) (length args)
120 xs' <- checkDefs ctxt xs
121 return ((n, SFun n' args ((locs + 1) - length args) exp') : xs')
126scopecheck :: DDefs -> [(Name, Int)] -> SExp -> StateT Int TC SExp
127scopecheck ctxt envTop tm = sc envTop tm where
128 sc env (SV (Glob n)) =
129 case lookup n (reverse env) of -- most recent first
130 Just i -> do lvar i; return (SV (Loc i))
131 Nothing -> case lookupCtxt Nothing n ctxt of
132 [DConstructor _ i ar] ->
134 then return (SCon i n [])
135 else fail $ "Codegen error: Constructor " ++ show n ++
136 " has arity " ++ show ar
137 [_] -> return (SV (Glob n))
138 [] -> fail $ "Codegen error: No such variable " ++ show n
139 sc env (SApp tc f args)
140 = do args' <- mapM (scVar env) args
141 case lookupCtxt Nothing f ctxt of
142 [DConstructor n tag ar] ->
143 if True -- (ar == length args)
144 then return $ SCon tag n args'
145 else fail $ "Codegen error: Constructor " ++ show f ++
146 " has arity " ++ show ar
147 [_] -> return $ SApp tc f args'
148 [] -> fail $ "Codegen error: No such variable " ++ show f
149 sc env (SForeign l ty f args)
150 = do args' <- mapM (\ (t, a) -> do a' <- scVar env a
152 return $ SForeign l ty f args'
153 sc env (SCon tag f args)
154 = do args' <- mapM (scVar env) args
155 case lookupCtxt Nothing f ctxt of
156 [DConstructor n tag ar] ->
157 if True -- (ar == length args)
158 then return $ SCon tag n args'
159 else fail $ "Codegen error: Constructor " ++ show f ++
160 " has arity " ++ show ar
161 _ -> fail $ "Codegen error: No such constructor " ++ show f
163 = do e' <- scVar env e
165 sc env (SCase e alts)
166 = do e' <- scVar env e
167 alts' <- mapM (scalt env) alts
168 return (SCase e' alts')
169 sc env (SLet (Glob n) v e)
170 = do let env' = env ++ [(n, length env)]
172 n' <- scVar env' (Glob n)
174 return (SLet n' v' e')
175 sc env (SUpdate (Glob n) e)
176 = do -- n already in env
178 n' <- scVar env (Glob n)
179 return (SUpdate n' e')
180 sc env (SOp prim args)
181 = do args' <- mapM (scVar env) args
182 return (SOp prim args')
186 case lookup n (reverse env) of -- most recent first
187 Just i -> do lvar i; return (Loc i)
188 Nothing -> case lookupCtxt Nothing n ctxt of
189 [DConstructor _ i ar] ->
190 fail $ "Codegen error : can't pass constructor here"
191 [_] -> return (Glob n)
192 [] -> fail $ "Codegen error: No such variable " ++ show n ++
193 " in " ++ show tm ++ " " ++ show envTop
196 scalt env (SConCase _ i n args e)
197 = do let env' = env ++ zip args [length env..]
198 tag <- case lookupCtxt Nothing n ctxt of
199 [DConstructor _ i ar] ->
200 if True -- (length args == ar)
202 else fail $ "Codegen error: Constructor " ++ show n ++
203 " has arity " ++ show ar
204 _ -> fail $ "Codegen error: No constructor " ++ show n
206 return (SConCase (length env) tag n args e')
207 scalt env (SConstCase c e) = do e' <- sc env e
208 return (SConstCase c e')
209 scalt env (SDefaultCase e) = do e' <- sc env e
210 return (SDefaultCase e')
keysesc to close
- j k
- move down, up
- enter
- open
- esc
- back, or up a level
- 1 2 3 4
- readme, files, commits, refs
- /
- filter
- y
- copy the clone command
- c
- compare the chosen commit with another (or shift-click both)
- ?
- show or hide this list