@@ -780,23 +780,32 @@ TypeSig' ::=
780780@
781781 -}
782782let_ :: SyntaxInfo -> IdrisParser PTerm
783−let_ syn = try (do reserved "let"; fc <- getFC; n <- name;
784− ty <- option Placeholder (do lchar ':'; expr' syn)
785− lchar '='
786− v <- expr syn
787− ts <- option [] (do lchar '|'
788− sepBy1 (do_alt syn) (lchar '|'))
783+let_ syn = try (do reserved "let"
784+ ls <- indentedBlock (let_binding syn)
789785 reserved "in"; sc <- expr syn
790− case ts of
791− [] -> return (PLet n ty v sc)
792− alts -> return (PCase fc v ((PRef fc n, sc) : ts)))
793− <|> (do reserved "let"; fc <- getFC; pat <- expr' (syn { inPattern = True } )
794− symbol "="; v <- expr syn
795− ts <- option [] (do lchar '|'
796− sepBy1 (do_alt syn) (lchar '|'))
797− reserved "in"; sc <- expr syn
798− return (PCase fc v ((pat, sc) : ts)))
786+ return (buildLets ls sc))
787+-- <|> (do reserved "let"; fc <- getFC; pat <- expr' (syn { inPattern = True } )
788+-- symbol "="; v <- expr syn
789+-- ts <- option [] (do lchar '|'
790+-- sepBy1 (do_alt syn) (lchar '|'))
791+-- reserved "in"; sc <- expr syn
792+-- return (PCase fc v ((pat, sc) : ts)))
799793 <?> "let binding"
794+ where buildLets [] sc = sc
795+ buildLets ((fc,PRef _ n,ty,v,[]):ls) sc
796+ = PLet n ty v (buildLets ls sc)
797+ buildLets ((fc,pat,ty,v,alts):ls) sc
798+ = PCase fc v ((pat, buildLets ls sc) : alts)
799+
800+let_binding syn = do fc <- getFC;
801+ pat <- expr' (syn { inPattern = True })
802+ ty <- option Placeholder (do lchar ':'; expr' syn)
803+ lchar '='
804+ v <- expr syn
805+ ts <- option [] (do lchar '|'
806+ sepBy1 (do_alt syn) (lchar '|'))
807+ return (fc,pat,ty,v,ts)
808+
800809
801810{- | Parses a quote goal
802811