@@ -520,6 +520,7 @@ pSimpleExpr syn =
520 <|> try (pPair syn)
520 <|> try (pPair syn)
521 <|> try (pList syn)
521 <|> try (pList syn)
522 <|> try (pAlt syn)
522 <|> try (pAlt syn)
523+ <|> try (pIdiom syn)
523 <|> try (do lchar '('; e <- pExpr syn; lchar ')'; return e)
524 <|> try (do lchar '('; e <- pExpr syn; lchar ')'; return e)
524 <|> try (do lchar '('; fc <- pfc; o <- operator; e <- pExpr syn; lchar ')'
525 <|> try (do lchar '('; fc <- pfc; o <- operator; e <- pExpr syn; lchar ')'
525 return $ PLam (MN 0 "x") Placeholder
526 return $ PLam (MN 0 "x") Placeholder
@@ -683,6 +684,10 @@ pDo syn
683 <|> try (do e <- pExpr syn; fc <- pfc
684 <|> try (do e <- pExpr syn; fc <- pfc
684 return (DoExp fc e))
685 return (DoExp fc e))
688+ = do symbol "[|"; fc <- pfc; e <- pExpr syn; symbol "|]"
689+ return (PIdiom fc e)
686pConstant :: IParser Const
691pConstant :: IParser Const
687pConstant = do reserved "Integer";return BIType
692pConstant = do reserved "Integer";return BIType
688 <|> do reserved "Int"; return IType
693 <|> do reserved "Int"; return IType
@@ -988,6 +993,7 @@ desugar syn i t = let t' = expandDo (dsl_info syn) t in
989expandDo :: DSL -> PTerm -> PTerm
994expandDo :: DSL -> PTerm -> PTerm
990expandDo dsl (PLam n ty tm) = PLam n (expandDo dsl ty) (expandDo dsl tm)
995expandDo dsl (PLam n ty tm) = PLam n (expandDo dsl ty) (expandDo dsl tm)
996+expandDo dsl (PLet n ty v tm) = PLet n (expandDo dsl ty) (expandDo dsl v) (expandDo dsl tm)
991expandDo dsl (PPi p n ty tm) = PPi p n (expandDo dsl ty) (expandDo dsl tm)
997expandDo dsl (PPi p n ty tm) = PPi p n (expandDo dsl ty) (expandDo dsl tm)
992expandDo dsl (PApp fc t args) = PApp fc (expandDo dsl t)
998expandDo dsl (PApp fc t args) = PApp fc (expandDo dsl t)
993 (map (fmap (expandDo dsl)) args)
999 (map (fmap (expandDo dsl)) args)
@@ -1010,7 +1016,18 @@ expandDo dsl (PDoBlock ds) = expandDo dsl $ block (dsl_bind dsl) ds
1010 [pexp tm,
1016 [pexp tm,
1011 pexp (PLam (MN 0 "bindx") Placeholder (block b rest))]
1017 pexp (PLam (MN 0 "bindx") Placeholder (block b rest))]
1012 block b _ = PElabError "Invalid statement in do block"
1018 block b _ = PElabError "Invalid statement in do block"
1019+expandDo dsl (PIdiom fc e) = expandDo dsl $ unIdiom (dsl_apply dsl) (dsl_pure dsl) fc e
1013expandDo dsl t = t
1020expandDo dsl t = t
1022+unIdiom :: PTerm -> PTerm -> FC -> PTerm -> PTerm
1023+unIdiom ap pure fc e@(PApp _ _ _) = let f = getFn e in
1026+ getFn (PApp fc f args) = (PApp fc pure [pexp f], args)
1030+ mkap (f, a:as) = mkap (PApp fc ap [pexp f, a], as)
1032+unIdiom ap pure fc e = PApp fc pure [pexp e]