summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJoe Crayne <joe@jerkface.net>2019-03-22 16:53:07 -0400
committerJoe Crayne <joe@jerkface.net>2019-03-22 16:53:07 -0400
commitb511cbf06b5ad30a555c5bf99598b7257d628eea (patch)
tree6298a1201dad8d9dca2eb5d2862ae6764cb2d70a
parent7bb298c12edc219c40c16db31a40dba9db4702fc (diff)
Fixed ordering of comma-operator side effects.
-rw-r--r--monkeypatch.hs18
1 files changed, 9 insertions, 9 deletions
diff --git a/monkeypatch.hs b/monkeypatch.hs
index 10f868f..b72e346 100644
--- a/monkeypatch.hs
+++ b/monkeypatch.hs
@@ -266,15 +266,15 @@ grokExpression fe (CCast (CDecl [ CTypeSpec (CVoidType _) ]
266 } 266 }
267grokExpression fe (CComma exps _) = do 267grokExpression fe (CComma exps _) = do
268 gs <- mapM (grokExpression fe) exps 268 gs <- mapM (grokExpression fe) exps
269 let ss = concatMap fst gs -- TODO: resolve variable name conflicts 269 let gs2 = map (\(ss,x) -> foldr applyComputation (App () (hsvar "return") <$> x) ss) gs
270 cll = foldr1 (\x y -> infixFn x "seq" y) $ map (comp . snd) gs 270 parn e = Paren () e
271 frees = foldr1 Map.union (map (compFree . snd) gs) 271 ps = map (\x -> let k = uniqIdentifier "go" (compFree x) in fmap (\xx -> Lambda () [hspvar k] (infixOp (parn xx) ">>" (hsvar k))) x) (init gs2)
272 k = uniqIdentifier "go" frees 272 s = foldr applyComputation (last gs2) ps
273 return $ (,) ss Computation 273 hv = "u"
274 { compFree = frees 274 k = uniqIdentifier "go" (compFree s)
275 , compIntro = Map.empty 275 s' = fmap (\x -> Lambda () [hspvar k] (infixOp (parn x) ">>=" (Lambda () [hspvar hv] (hsvar k)))) s
276 , comp = cll 276 -- TODO: It would be cleaner if I could return only a statement and not an expression.
277 } 277 return ([s'],Computation (Map.singleton hv ()) Map.empty (hsvar hv))
278grokExpression fe (C.CCall (CVar fn _) exps _) = do 278grokExpression fe (C.CCall (CVar fn _) exps _) = do
279 gs <- mapM (grokExpression fe) exps 279 gs <- mapM (grokExpression fe) exps
280 let ss = concatMap fst gs -- TODO: resolve variable name conflicts 280 let ss = concatMap fst gs -- TODO: resolve variable name conflicts