@@ -34,29 +34,29 @@ ldefs :: State (LDefs, Int) LDefs
3434ldefs = do (l, h) <- get
3535 return l
3636
37−simplify :: LExp -> State (LDefs, Int) SExp
38−simplify (LV (Loc i)) = return (SV (Loc i))
39−simplify (LV (Glob x))
37+simplify :: Bool -> LExp -> State (LDefs, Int) SExp
38+simplify tl (LV (Loc i)) = return (SV (Loc i))
39+simplify tl (LV (Glob x))
4040 = do ctxt <- ldefs
4141 case lookupCtxt Nothing x ctxt of
4242 [LConstructor _ t 0] -> return $ SCon t x []
4343 _ -> return $ SV (Glob x)
44−simplify (LApp tc n args) = do args' <- mapM sVar args
45− mkapp (SApp tc n) args'
46−simplify (LLet n v e) = do v' <- simplify v
47− e' <- simplify e
48− return (SLet (Glob n) v' e')
49−simplify (LCon i n args) = do args' <- mapM sVar args
50− mkapp (SCon i n) args'
51−simplify (LCase e alts) = do v <- sVar e
52− alts' <- mapM sAlt alts
53− case v of
54− (x, Nothing) -> return (SCase x alts')
55− (Glob x, Just e) ->
56− return (SLet (Glob x) e (SCase (Glob x) alts'))
57−simplify (LConst c) = return (SConst c)
58−simplify (LOp p args) = do args' <- mapM sVar args
59− mkapp (SOp p) args'
44+simplify tl (LApp tc n args) = do args' <- mapM sVar args
45+ mkapp (SApp (tl || tc) n) args'
46+simplify tl (LLet n v e) = do v' <- simplify False v
47+ e' <- simplify tl e
48+ return (SLet (Glob n) v' e')
49+simplify tl (LCon i n args) = do args' <- mapM sVar args
50+ mkapp (SCon i n) args'
51+simplify tl (LCase e alts) = do v <- sVar e
52+ alts' <- mapM (sAlt tl) alts
53+ case v of
54+ (x, Nothing) -> return (SCase x alts')
55+ (Glob x, Just e) ->
56+ return (SLet (Glob x) e (SCase (Glob x) alts'))
57+simplify tl (LConst c) = return (SConst c)
58+simplify tl (LOp p args) = do args' <- mapM sVar args
59+ mkapp (SOp p) args'
6060
6161sVar (LV (Glob x))
6262 = do ctxt <- ldefs
@@ -64,7 +64,7 @@ sVar (LV (Glob x))
6464 [LConstructor _ t 0] -> sVar (LCon t x [])
6565 _ -> return (Glob x, Nothing)
6666sVar (LV x) = return (x, Nothing)
67−sVar e = do e' <- simplify e
67+sVar e = do e' <- simplify False e
6868 i <- hvar
6969 return (Glob (MN i "R"), Just e')
7070
@@ -75,12 +75,12 @@ mkapp f args = mkapp' f args [] where
7575 = do sc <- mkapp' f xs (x : args)
7676 return (SLet x e sc)
7777
78−sAlt (LConCase i n args e) = do e' <- simplify e
79− return (SConCase (-1) i n args e')
80−sAlt (LConstCase c e) = do e' <- simplify e
81− return (SConstCase c e')
82−sAlt (LDefaultCase e) = do e' <- simplify e
83− return (SDefaultCase e')
78+sAlt tl (LConCase i n args e) = do e' <- simplify tl e
79+ return (SConCase (-1) i n args e')
80+sAlt tl (LConstCase c e) = do e' <- simplify tl e
81+ return (SConstCase c e')
82+sAlt tl (LDefaultCase e) = do e' <- simplify tl e
83+ return (SDefaultCase e')
8484
8585checkDefs :: LDefs -> [(Name, LDecl)] -> TC [(Name, SDecl)]
8686checkDefs ctxt [] = return []
@@ -88,7 +88,7 @@ checkDefs ctxt (con@(n, LConstructor _ _ _) : xs)
8888 = do xs' <- checkDefs ctxt xs
8989 return xs'
9090checkDefs ctxt ((n, LFun n' args exp) : xs)
91− = do let sexp = evalState (simplify exp) (ctxt, 0)
91+ = do let sexp = evalState (simplify True exp) (ctxt, 0)
9292 (exp', locs) <- runStateT (scopecheck ctxt (zip args [0..]) sexp) (-1)
9393 xs' <- checkDefs ctxt xs
9494 return ((n, SFun n' args ((locs + 1) - length args) exp') : xs')