diff options
author | Joe Crayne <joe@jerkface.net> | 2019-03-22 16:53:07 -0400 |
---|---|---|
committer | Joe Crayne <joe@jerkface.net> | 2019-03-22 16:53:07 -0400 |
commit | b511cbf06b5ad30a555c5bf99598b7257d628eea (patch) | |
tree | 6298a1201dad8d9dca2eb5d2862ae6764cb2d70a | |
parent | 7bb298c12edc219c40c16db31a40dba9db4702fc (diff) |
Fixed ordering of comma-operator side effects.
-rw-r--r-- | monkeypatch.hs | 18 |
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 | } |
267 | grokExpression fe (CComma exps _) = do | 267 | grokExpression 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)) |
278 | grokExpression fe (C.CCall (CVar fn _) exps _) = do | 278 | grokExpression 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 |