-- ==========================================================-- -- === Reduction of abstract expressions ===-- -- === AbstractEval2.hs ===-- -- ==========================================================-- module AbstractEval2 where import BaseDefs import Utils import MyUtils import AbstractVals2 import Apply -- ==========================================================-- -- aeEval :: HExpr Naam -> HExpr Naam aeEval (HVar _) = panic "aeEval(1)" aeEval (HLam _ _) = panic "aeEval(2)" aeEval (HTable _) = panic "aeEval(3)" aeEval h@(HPoint _) = h aeEval (HMeet es) = HPoint (foldr1 (\/) (map aeEvalConst es)) aeEval (HApp (HTable t) e2) = aeEval (utSureLookup t "aeEval(5)" (aeEvalConst e2)) aeEval (HVAp (HPoint f) es) = HPoint (apApply f (map aeEvalConst es)) aeEval (HApp f@(HApp _ _) someArg) = aeEval (HApp (aeEval f) someArg) aeEval (HApp f@(HPoint _) e) = aeEval (HVAp f [e]) aeEval x = panic "aeEval(4)" -- ==========================================================-- -- aeEvalConst :: HExpr Naam -> Route aeEvalConst e = case aeEval e of {HPoint p -> p; _ -> panic "aeEvalConst"} -- ==========================================================-- -- aeEvalExact :: HExpr Naam -> [HExpr Naam] -> Route aeEvalExact (HLam vs e) args = case aeEval (aeSubst (myZip2 vs args) e) of {HPoint p -> p; _ -> panic "aeEvalExact"} -- ==========================================================-- -- aeSubst :: AList Naam (HExpr Naam) -> HExpr Naam -> HExpr Naam aeSubst rho (HVar v) = utSureLookup rho "aeSubst" v aeSubst rho h@(HPoint p) = h aeSubst rho (HLam _ _) = panic "aeSubst(1)" aeSubst rho (HMeet es) = HMeet (map (aeSubst rho) es) aeSubst rho (HTable t) = HTable (map2nd (aeSubst rho) t) aeSubst rho (HApp e1 e2) = HApp (aeSubst rho e1) (aeSubst rho e2) aeSubst rho (HVAp f es) = HVAp (aeSubst rho f) (map (aeSubst rho) es) -- ==========================================================-- -- aeMkMeet :: HExpr Naam -> [HExpr Naam] -> HExpr Naam aeMkMeet bottom [] = bottom aeMkMeet bottom [x] = x aeMkMeet bottom xs = HMeet xs -- ==========================================================-- -- === end AbstractEval2.hs ===-- -- ==========================================================--