diff --git a/src/Init/LeanInit.lean b/src/Init/LeanInit.lean index 655ca39587..01a5847d0f 100644 --- a/src/Init/LeanInit.lean +++ b/src/Init/LeanInit.lean @@ -781,6 +781,11 @@ def isAtom : Syntax → Bool | atom _ _ => true | _ => false +def isToken (token : String) : Syntax → Bool +| atom _ val => val.trim == token.trim +| _ => false + + def isIdent : Syntax → Bool | ident _ _ _ _ => true | _ => false diff --git a/src/Lean/Elab/Do.lean b/src/Lean/Elab/Do.lean index 1f0b2587e9..0bafb18899 100644 --- a/src/Lean/Elab/Do.lean +++ b/src/Lean/Elab/Do.lean @@ -43,7 +43,11 @@ match expectedType? with private def getDoElems (stx : Syntax) : Array Syntax := let arg := stx.getArg 1; if arg.getKind == `Lean.Parser.Term.doSeqBracketed then - (arg.getArg 1).getArgs + let args := (arg.getArg 1).getArgs; + if args.back.isToken ";" then -- temporary hack + args.pop + else + args else arg.getArgs @@ -219,6 +223,7 @@ fun stx expectedType? => do let doElems := getDoElems stx; trace `Elab.do $ fun _ => stx; let doElems := doElems.getSepElems; + trace `Elab.do $ fun _ => "doElems: " ++ toString doElems; { m := m, hasBindInst := bindInstVal, .. } ← extractBind expectedType?; result ← processDoElems doElems m bindInstVal expectedType?.get!; -- dbgTrace ("result: " ++ toString result); diff --git a/src/Lean/Parser/Do.lean b/src/Lean/Parser/Do.lean index d9640a34bb..b310768050 100644 --- a/src/Lean/Parser/Do.lean +++ b/src/Lean/Parser/Do.lean @@ -22,7 +22,7 @@ def leftArrow : Parser := unicodeSymbol " ← " " <- " @[builtinTermParser] def liftMethod := parser!:0 leftArrow >> termParser def doSeqIndent := withPosition fun pos => sepBy1 doElemParser (try ("; " >> checkColGe pos.column "do-elements must be indented")) -def doSeqBracketed := parser! "{" >> sepBy1 doElemParser "; " >> "}" +def doSeqBracketed := parser! "{" >> sepBy1 doElemParser "; " true >> "}" def doSeq := doSeqBracketed <|> doSeqIndent @[builtinDoElemParser] def doLet := parser! "let " >> letDecl diff --git a/tests/lean/run/doNotation1.lean b/tests/lean/run/doNotation1.lean index 3cb5e815c6..076911e2b9 100644 --- a/tests/lean/run/doNotation1.lean +++ b/tests/lean/run/doNotation1.lean @@ -52,6 +52,13 @@ m1; m2 a; pure 1 +def tst0 : IO Unit := do { +a ← f; +let x := a + 1; +IO.println "hello"; +IO.println x; +} + def tst1 : IO Unit := do a ← f; let x := a + 1;