diff options
author | Péter Diviánszky <divipp@gmail.com> | 2016-01-22 21:54:50 +0100 |
---|---|---|
committer | Péter Diviánszky <divipp@gmail.com> | 2016-01-22 22:09:03 +0100 |
commit | ad899f80977e97a0d016852b4bc4d0be5a521ac2 (patch) | |
tree | 9482075f478365da9d2299713658281035a4b10e /src | |
parent | cce1dff785362e20ebb07188484dbeecb96a6442 (diff) |
support guards in case alternatives
Diffstat (limited to 'src')
-rw-r--r-- | src/LambdaCube/Compiler/Infer.hs | 36 |
1 files changed, 17 insertions, 19 deletions
diff --git a/src/LambdaCube/Compiler/Infer.hs b/src/LambdaCube/Compiler/Infer.hs index 8d3ee968..c3b13b82 100644 --- a/src/LambdaCube/Compiler/Infer.hs +++ b/src/LambdaCube/Compiler/Infer.hs | |||
@@ -1743,13 +1743,6 @@ telescopeDataFields ns = {-telescopeSI ns Nothing-} go [] | |||
1743 | return (name, (Visible, dbf' (DBNamesC vs) term)) | 1743 | return (name, (Visible, dbf' (DBNamesC vs) term)) |
1744 | ((++[x]) *** (vt:)) <$> (comma *> go (x: vs) <|> pure ([], [])) | 1744 | ((++[x]) *** (vt:)) <$> (comma *> go (x: vs) <|> pure ([], [])) |
1745 | 1745 | ||
1746 | parseClause ns = do | ||
1747 | (fe, p) <- pattern' ns | ||
1748 | localIndentation Gt $ do | ||
1749 | x <- reservedOp "->" *> parseETerm ns PrecLam | ||
1750 | f <- parseWhereBlock ns | ||
1751 | return (p, dbf' fe $ f x) | ||
1752 | |||
1753 | patternAtom ns = patternAtom' ns <&> \p -> (getPVars p, p) | 1746 | patternAtom ns = patternAtom' ns <&> \p -> (getPVars p, p) |
1754 | patternAtom' ns = | 1747 | patternAtom' ns = |
1755 | -- <|> sLit . LInt . fromIntegral <$ char '#' <*> natural | 1748 | -- <|> sLit . LInt . fromIntegral <$ char '#' <*> natural |
@@ -1971,15 +1964,17 @@ funAltDef parseName ns = do -- todo: use ns to determine parseName | |||
1971 | localIndentation Gt $ (,) n <$> (telescopePat ns >>= \ps -> checkPattern (fst ps) >> return ps) <* (lookAhead $ reservedOp "=" <|> reservedOp "|") | 1964 | localIndentation Gt $ (,) n <$> (telescopePat ns >>= \ps -> checkPattern (fst ps) >> return ps) <* (lookAhead $ reservedOp "=" <|> reservedOp "|") |
1972 | let fe = dbf' $ fee <> addDBName n | 1965 | let fe = dbf' $ fee <> addDBName n |
1973 | ts = map (id *** upP 0 1{-todo: replace n with Var 0-}) tss | 1966 | ts = map (id *** upP 0 1{-todo: replace n with Var 0-}) tss |
1974 | localIndentation Gt $ do | 1967 | FunAlt n ts <$> parseRHS ns fe "=" |
1975 | gs <- some $ (,) <$ reservedOp "|" <*> parseTerm ns PrecOp <* reservedOp "=" <*> parseTerm ns PrecLam | 1968 | |
1976 | -- f <- parseWhereBlock ns -- todo: where + guards | 1969 | parseRHS ns fe tok = localIndentation Gt $ do |
1977 | return $ FunAlt n ts $ Left $ fmap (fe *** fe) gs | 1970 | gs <- some $ (,) <$ reservedOp "|" <*> parseTerm ns PrecOp <* reservedOp tok <*> parseTerm ns PrecLam |
1978 | <|> do | 1971 | -- f <- parseWhereBlock ns -- todo: where + guards |
1979 | reservedOp "=" | 1972 | return $ Left $ fmap (fe *** fe) gs |
1980 | rhs <- parseTerm ns PrecLam | 1973 | <|> do |
1981 | f <- parseWhereBlock ns | 1974 | reservedOp tok |
1982 | return $ FunAlt n ts $ Right $ (fe . f) rhs | 1975 | rhs <- parseTerm ns PrecLam |
1976 | f <- parseWhereBlock ns | ||
1977 | return $ Right $ (fe . f) rhs | ||
1983 | 1978 | ||
1984 | dbFunAlt v (FunAlt n ts gue) = FunAlt n (map (id *** mapP (dbf' v)) ts) $ fmap (dbf' v *** dbf' v) +++ dbf' v $ gue | 1979 | dbFunAlt v (FunAlt n ts gue) = FunAlt n (map (id *** mapP (dbf' v)) ts) $ fmap (dbf' v *** dbf' v) +++ dbf' v $ gue |
1985 | 1980 | ||
@@ -2036,8 +2031,11 @@ parseTerm ns prec = withRange setSI $ case prec of | |||
2036 | t' <- dbf' fe <$> parseTerm ns' PrecLam | 2031 | t' <- dbf' fe <$> parseTerm ns' PrecLam |
2037 | ge <- ask | 2032 | ge <- ask |
2038 | return $ foldr (uncurry (patLam_ id ge)) t' ts | 2033 | return $ foldr (uncurry (patLam_ id ge)) t' ts |
2039 | <|> do (asks compileCase) <* reserved "case" <*> parseETerm ns PrecLam | 2034 | <|> do asks compileCase <* reserved "case" <*> parseETerm ns PrecLam |
2040 | <* reserved "of" <*> localIndentation Ge (localAbsoluteIndentation $ some $ parseClause ns) | 2035 | <* reserved "of" <*> localIndentation Ge (localAbsoluteIndentation $ some $ do |
2036 | (fe, p) <- pattern' ns | ||
2037 | (,) p <$> parseRHS ns (dbf' fe) "->" | ||
2038 | ) | ||
2041 | <|> do (asks $ \ge -> compileGuardTree id id ge . Alts) <*> parseSomeGuards ns (const True) | 2039 | <|> do (asks $ \ge -> compileGuardTree id id ge . Alts) <*> parseSomeGuards ns (const True) |
2042 | <|> do t <- parseTerm ns PrecEq | 2040 | <|> do t <- parseTerm ns PrecEq |
2043 | option t $ mkPi <$> (Visible <$ reservedOp "->" <|> Hidden <$ reservedOp "=>") <*> pure t <*> parseTTerm ns PrecLam | 2041 | option t $ mkPi <$> (Visible <$ reservedOp "->" <|> Hidden <$ reservedOp "=>") <*> pure t <*> parseTTerm ns PrecLam |
@@ -2489,7 +2487,7 @@ compileGuardTree unode node adts t = (\x -> traceD (" ! :" ++ showSExp x) x) $ | |||
2489 | varGuardNode v (SVar _ e) gt = substGT v e gt | 2487 | varGuardNode v (SVar _ e) gt = substGT v e gt |
2490 | 2488 | ||
2491 | compileCase ge x cs | 2489 | compileCase ge x cs |
2492 | = SLamV (compileGuardTree id id ge $ Alts [compilePatts [(p, 0)] $ Right e | (p, e) <- cs]) `SAppV` x | 2490 | = SLamV (compileGuardTree id id ge $ Alts [compilePatts [(p, 0)] e | (p, e) <- cs]) `SAppV` x |
2493 | 2491 | ||
2494 | -- todo: clenup | 2492 | -- todo: clenup |
2495 | compilePatts :: [(Pat, Int)] -> Either [(SExp, SExp)] SExp -> GuardTree | 2493 | compilePatts :: [(Pat, Int)] -> Either [(SExp, SExp)] SExp -> GuardTree |