diff options
| author | aarne <aarne@chalmers.se> | 2009-05-18 15:01:18 +0000 |
|---|---|---|
| committer | aarne <aarne@chalmers.se> | 2009-05-18 15:01:18 +0000 |
| commit | 7508fa578551672711fcec8c4b37d79c3a3de5ef (patch) | |
| tree | 5825bf5dfbc57951c2606c6ec1f80bfa4748cf61 /src/GF/Compile/Compute.hs | |
| parent | 953c77a08ac708a6f3ee0d8103d80c40e306b77f (diff) | |
pattern macros: oper f : pattern T = # p ; used as #f in patterns
Diffstat (limited to 'src/GF/Compile/Compute.hs')
| -rw-r--r-- | src/GF/Compile/Compute.hs | 27 |
1 files changed, 22 insertions, 5 deletions
diff --git a/src/GF/Compile/Compute.hs b/src/GF/Compile/Compute.hs index d9fb8c12b..dc7b51071 100644 --- a/src/GF/Compile/Compute.hs +++ b/src/GF/Compile/Compute.hs @@ -33,7 +33,7 @@ import GF.Grammar.AppPredefined import Data.List (nub,intersperse) import Control.Monad (liftM2, liftM) -----import Debug.Trace ---- +---- import Debug.Trace ---- -- | computation of concrete syntax terms into normal form -- used mainly for partial evaluation @@ -186,9 +186,10 @@ computeTermOpt rec gr = comput True where r <- composOp (comp g) t returnC r - Alts _ -> do - r <- composOp (comp g) t - returnC r + Alts (d,aa) -> do + d' <- comp g d + aa' <- mapM (compInAlts g) aa + returnC (Alts (d',aa')) -- remove empty C a b -> do @@ -363,7 +364,10 @@ computeTermOpt rec gr = comput True where ---- return $ V ptyp ts -- to save space, just course of values return $ T (TComp ptyp) (zip ps' ts) _ -> do - cs' <- mapM (compBranch g) cs + ps0 <- mapM (compPatternMacro . fst) cs + cs' <- mapM (compBranch g) (zip ps0 (map snd cs)) + +---- cs' <- mapM (compBranch g) cs return $ T i cs' -- happens with variable types _ -> comp g t @@ -399,6 +403,19 @@ computeTermOpt rec gr = comput True where cs' <- mapM (comp g) [(f v) | v <- cs] return $ S (V i cs') e + compInAlts g (v,c) = do + v' <- comp g v + c' <- comp g c + c2 <- case c' of + EPatt p -> liftM Strs $ getPatts p + _ -> return c' + return (v',c2) + where + getPatts p = case p of + PAlt a b -> liftM2 (++) (getPatts a) (getPatts b) + PString s -> return [K s] + _ -> fail $ "not valid pattern in pre expression" +++ prt p + {- ---- uncurrySelect g fs t v = do ts <- mapM (allParamValues gr . snd) fs |
