summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorPéter Diviánszky <divipp@gmail.com>2016-01-22 21:54:50 +0100
committerPéter Diviánszky <divipp@gmail.com>2016-01-22 22:09:03 +0100
commitad899f80977e97a0d016852b4bc4d0be5a521ac2 (patch)
tree9482075f478365da9d2299713658281035a4b10e /src
parentcce1dff785362e20ebb07188484dbeecb96a6442 (diff)
support guards in case alternatives
Diffstat (limited to 'src')
-rw-r--r--src/LambdaCube/Compiler/Infer.hs36
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
1746parseClause 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
1753patternAtom ns = patternAtom' ns <&> \p -> (getPVars p, p) 1746patternAtom ns = patternAtom' ns <&> \p -> (getPVars p, p)
1754patternAtom' ns = 1747patternAtom' 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 1969parseRHS 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
1984dbFunAlt v (FunAlt n ts gue) = FunAlt n (map (id *** mapP (dbf' v)) ts) $ fmap (dbf' v *** dbf' v) +++ dbf' v $ gue 1979dbFunAlt 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) $
2489varGuardNode v (SVar _ e) gt = substGT v e gt 2487varGuardNode v (SVar _ e) gt = substGT v e gt
2490 2488
2491compileCase ge x cs 2489compileCase 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
2495compilePatts :: [(Pat, Int)] -> Either [(SExp, SExp)] SExp -> GuardTree 2493compilePatts :: [(Pat, Int)] -> Either [(SExp, SExp)] SExp -> GuardTree