@@ -112,15 +112,16 @@ collect [] = []
113pFullExpr :: SyntaxInfo -> IParser PTerm
113pFullExpr :: SyntaxInfo -> IParser PTerm
114pFullExpr syn
114pFullExpr syn
115− = do x <- pExpr syn; eof;
115+ = do x <- pExpr syn; eof;
116 i <- getState
116 i <- getState
117− return (addImpl i x)
117+ return $ desugar syn i x
119pDecl :: SyntaxInfo -> IParser [PDecl]
119pDecl :: SyntaxInfo -> IParser [PDecl]
121 = do d <- pDecl' syn
121 = do d <- pDecl' syn
122 i <- getState
122 i <- getState
123− return [fmap (addImpl i) d]
123+ let d' = fmap (desugar syn i) d
124 <|> try (pUsing syn)
125 <|> try (pUsing syn)
125 <|> try (pParams syn)
126 <|> try (pParams syn)
126 <|> try (do reserved "import"
127 <|> try (do reserved "import"
@@ -132,7 +133,8 @@ pFunDecl :: SyntaxInfo -> IParser [PDecl]
132pFunDecl syn
133pFunDecl syn
133 = try (do d <- pFunDecl' syn
134 = try (do d <- pFunDecl' syn
134 i <- getState
135 i <- getState
135− return [fmap (addImpl i) d])
136+ let d' = fmap (desugar syn i) d
137--------- Top Level Declarations ---------
139--------- Top Level Declarations ---------
@@ -202,13 +204,15 @@ pExpr' syn
202 <|> pSimpleExpr syn
204 <|> pSimpleExpr syn
203 <|> try (pLambda syn)
205 <|> try (pLambda syn)
204 <|> try (pPi syn)
206 <|> try (pPi syn)
205−
207+ <|> try (pDoBlock syn)
206pfName = try iName
209pfName = try iName
207 <|> do lchar '('; o <- operator; lchar ')'; return (UN [o])
210 <|> do lchar '('; o <- operator; lchar ')'; return (UN [o])
209pSimpleExpr syn =
212pSimpleExpr syn =
210 try (do symbol "!["; t <- pTerm; lchar ']'
213 try (do symbol "!["; t <- pTerm; lchar ']'
211 return $ PQuote t)
214 return $ PQuote t)
215+ <|> try (do reserved "return"; return PReturn)
212 <|> try (do x <- pfName; return (PRef x))
216 <|> try (do x <- pfName; return (PRef x))
213 <|> try (do lchar '('; l <- pExpr syn; lchar ','; r <- pExpr syn; lchar ')';
217 <|> try (do lchar '('; l <- pExpr syn; lchar ','; r <- pExpr syn; lchar ')';
214 return (PPair l r))
218 return (PPair l r))
@@ -267,6 +271,19 @@ tyOptDeclList syn = sepBy1 (do x <- pfName; t <- option Placeholder (pTSig syn)
267bindList b [] sc = sc
271bindList b [] sc = sc
268bindList b ((n, t):bs) sc = b n t (bindList b bs sc)
272bindList b ((n, t):bs) sc = b n t (bindList b bs sc)
275+ = do reserved "do"; lchar '{'
276+ ds <- endBy1 (pDo syn) (lchar ';')
278+ return (PDoBlock ds)
281+ = try (do i <- iName; symbol "<-"; e <- pExpr syn;
282+ return (DoBind i e))
283+ <|> try (do reserved "let"; i <- iName; reservedOp "="; e <- pExpr syn
285+ <|> try (do e <- pExpr syn; return (DoExp e))
270pConstant :: IParser Const
287pConstant :: IParser Const
271pConstant = do reserved "Int"; return IType
288pConstant = do reserved "Int"; return IType
272 <|> do reserved "Char"; return ChType
289 <|> do reserved "Char"; return ChType
@@ -376,4 +393,27 @@ implicit syn n ptm
376 setState (i { idris_implicits = addDef n impdata (idris_implicits i) })
393 setState (i { idris_implicits = addDef n impdata (idris_implicits i) })
377 return tm'
394 return tm'
396+desugar :: SyntaxInfo -> IState -> PTerm -> PTerm
397+desugar syn i t = let t' = expandDo (dsl_info syn) t in
400+expandDo :: DSL -> PTerm -> PTerm
401+expandDo dsl (PLam n ty tm) = PLam n (expandDo dsl ty) (expandDo dsl tm)
402+expandDo dsl (PPi p n ty tm) = PPi p n (expandDo dsl ty) (expandDo dsl tm)
403+expandDo dsl (PApp t args) = PApp (expandDo dsl t)
404+ (map (fmap (expandDo dsl)) args)
405+expandDo dsl (PPair l r) = PPair (expandDo dsl l) (expandDo dsl r)
406+expandDo dsl (PHidden t) = PHidden (expandDo dsl t)
407+expandDo dsl PReturn = PRef (dsl_return dsl)
408+expandDo dsl (PDoBlock ds) = expandDo dsl $ block (dsl_bind dsl) ds
410+ block b [DoExp tm] = tm
411+ block b [a] = PElabError "Last statement in do block must be an expression"
412+ block b (DoBind n tm : rest)
413+ = PApp (PRef b) [PExp tm, PExp (PLam n Placeholder (block b rest))]
414+ block b (DoExp tm : rest)
415+ = PApp (PRef b) [PExp tm, PExp (PLam (MN 0 "bindx") Placeholder (block b rest))]