From dd3d50853b422014de16df23bd914fc6de790ea8 Mon Sep 17 00:00:00 2001 From: Joe Crayne Date: Sat, 23 Mar 2019 23:56:50 -0400 Subject: grok reading a field from a struct or ptr. --- monkeypatch.hs | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/monkeypatch.hs b/monkeypatch.hs index 5228dce..8e2dcf8 100644 --- a/monkeypatch.hs +++ b/monkeypatch.hs @@ -431,9 +431,22 @@ grokExpression fe (CAssign CAssignOp cvar expr _) = do $ Lambda () [hspvar v] (hsvar k) } return $ (,) (ss ++ [s]) $ mkcomp (hsvar v) +grokExpression fe (CMember cvar fld isptr _) = do + v <- cvarName cvar + let fieldlbl = identToString fld + hv = v ++ fieldlbl + e = App () (App () (hsvar "get") + (TypeApp () (TyPromoted () (PromotedString () fieldlbl fieldlbl)))) + (hsvar v) + e' = (mkcomp e){ compFree = Map.singleton v () } + k = uniqIdentifier "go" (varmap [hv,v,fieldlbl]) + s = (FormalLambda k <$> fmap (($ Lambda () [hspvar hv] (hsvar k)) . (`infixOp` ">>=")) e') + { compIntro = Map.singleton hv () } + return $ (,) [s] (mkcomp $ hsvar hv){ compFree = Map.singleton hv () } grokExpression fe _ = Nothing + grokInitialization :: Foldable t1 => FunctionEnvironment -> t1 (CDeclarationSpecifier t2) -- cgit v1.2.3