@@ -112,15 +112,16 @@ collect [] = []
112112
113113pFullExpr :: SyntaxInfo -> IParser PTerm
114114pFullExpr syn
115− = do x <- pExpr syn; eof;
115+ = do x <- pExpr syn; eof;
116116 i <- getState
117− return (addImpl i x)
117+ return $ desugar syn i x
118118
119119pDecl :: SyntaxInfo -> IParser [PDecl]
120120pDecl syn
121121 = do d <- pDecl' syn
122122 i <- getState
123− return [fmap (addImpl i) d]
123+ let d' = fmap (desugar syn i) d
124+ return [d']
124125 <|> try (pUsing syn)
125126 <|> try (pParams syn)
126127 <|> try (do reserved "import"
@@ -132,7 +133,8 @@ pFunDecl :: SyntaxInfo -> IParser [PDecl]
132133pFunDecl syn
133134 = try (do d <- pFunDecl' syn
134135 i <- getState
135− return [fmap (addImpl i) d])
136+ let d' = fmap (desugar syn i) d
137+ return [d'])
136138
137139--------- Top Level Declarations ---------
138140
@@ -202,13 +204,15 @@ pExpr' syn
202204 <|> pSimpleExpr syn
203205 <|> try (pLambda syn)
204206 <|> try (pPi syn)
205−
207+ <|> try (pDoBlock syn)
208+
206209pfName = try iName
207210 <|> do lchar '('; o <- operator; lchar ')'; return (UN [o])
208211
209212pSimpleExpr syn =
210213 try (do symbol "!["; t <- pTerm; lchar ']'
211214 return $ PQuote t)
215+ <|> try (do reserved "return"; return PReturn)
212216 <|> try (do x <- pfName; return (PRef x))
213217 <|> try (do lchar '('; l <- pExpr syn; lchar ','; r <- pExpr syn; lchar ')';
214218 return (PPair l r))
@@ -267,6 +271,19 @@ tyOptDeclList syn = sepBy1 (do x <- pfName; t <- option Placeholder (pTSig syn)
267271bindList b [] sc = sc
268272bindList b ((n, t):bs) sc = b n t (bindList b bs sc)
269273
274+pDoBlock syn
275+ = do reserved "do"; lchar '{'
276+ ds <- endBy1 (pDo syn) (lchar ';')
277+ lchar '}'
278+ return (PDoBlock ds)
279+
280+pDo syn
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
284+ return (DoLet i e))
285+ <|> try (do e <- pExpr syn; return (DoExp e))
286+
270287pConstant :: IParser Const
271288pConstant = do reserved "Int"; return IType
272289 <|> do reserved "Char"; return ChType
@@ -376,4 +393,27 @@ implicit syn n ptm
376393 setState (i { idris_implicits = addDef n impdata (idris_implicits i) })
377394 return tm'
378395
396+desugar :: SyntaxInfo -> IState -> PTerm -> PTerm
397+desugar syn i t = let t' = expandDo (dsl_info syn) t in
398+ addImpl i t'
399+
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
409+ where
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))]
416+expandDo dsl t = t
417+
418+
379419