on master help sign in
Add a way to flatten lets that have become nested
621a9c2Evan Czaplicki
compiler/Transform/SortDefinitions.hs+7−1
@@ -1,5 +1,5 @@
1
1
2−module Transform.SortDefinitions (sortDefs, boundVars) where
2+module Transform.SortDefinitions (sortDefs, boundVars, flattenLets) where
3
3
4import Control.Monad.State
4import Control.Monad.State
5import Control.Applicative ((<$>))
5import Control.Applicative ((<$>))
@@ -30,6 +30,12 @@ bound boundVars = modify (\freeVars -> Set.difference freeVars boundVars)
30sortDefs :: LExpr t v -> LExpr t v
30sortDefs :: LExpr t v -> LExpr t v
31sortDefs expr = evalState (reorder expr) Set.empty
31sortDefs expr = evalState (reorder expr) Set.empty
32
32
33+flattenLets defs lexpr@(L _ _ expr) =
34+ case expr of
35+ Let ds body -> flattenLets (defs ++ ds) body
36+ _ -> (defs, lexpr)
37+
38+
33reorder :: LExpr t v -> State (Set.Set String) (LExpr t v)
39reorder :: LExpr t v -> State (Set.Set String) (LExpr t v)
34reorder lexpr@(L a b expr) =
40reorder lexpr@(L a b expr) =
35 L a b `liftM`
41 L a b `liftM`