This PR promotes the `repeat`, `while`, and `repeat ... until` parsers from `syntax` declarations in `Init.While` to `@[builtin_doElem_parser]` definitions in `Lean.Parser.Do`, alongside the other do-element parsers. The `while` variants and `repeat ... until` get `@[builtin_macro]` expansions; `repeat` itself gets a `@[builtin_doElem_elab]` so a follow-up can extend it with an option-driven choice between `Loop.mk` and a well-founded `Repeat.mk`. The new builtin parsers are registered at `low` priority so that the bootstrapping `syntax` declarations in `Init.While` (still needed for stage0 compatibility) take precedence during the transition. After the next stage0 update, the `Init.While` syntax and macros can be removed.
44 lines
1.5 KiB
Text
44 lines
1.5 KiB
Text
/-
|
|
Copyright (c) 2026 Lean FRO, LLC. All rights reserved.
|
|
Released under Apache 2.0 license as described in the file LICENSE.
|
|
Authors: Sebastian Graf
|
|
-/
|
|
module
|
|
|
|
prelude
|
|
public import Lean.Elab.BuiltinDo.Basic
|
|
meta import Lean.Parser.Do
|
|
import Lean.Elab.BuiltinDo.For
|
|
|
|
public section
|
|
|
|
namespace Lean.Elab.Do
|
|
|
|
open Lean.Parser.Term
|
|
|
|
/--
|
|
Builtin do-element elaborator for `repeat` (syntax kind `Lean.Parser.Term.doRepeat`).
|
|
|
|
Expands to `for _ in Loop.mk do ...`. A follow-up change will extend this
|
|
elaborator to choose between `Loop.mk` and a well-founded `Repeat.mk` based on a
|
|
configuration option.
|
|
-/
|
|
@[builtin_doElem_elab Lean.Parser.Term.doRepeat] def elabDoRepeat : DoElab := fun stx dec => do
|
|
let `(doElem| repeat%$tk $seq) := stx | throwUnsupportedSyntax
|
|
let expanded ← `(doElem| for%$tk _ in Loop.mk do $seq)
|
|
Term.withMacroExpansion stx expanded <|
|
|
withRef expanded <| elabDoElem ⟨expanded⟩ dec
|
|
|
|
@[builtin_macro Lean.Parser.Term.doWhileH] def expandDoWhileH : Macro
|
|
| `(doElem| while%$tk $h : $cond do $seq) => `(doElem| repeat%$tk if $h:ident : $cond then $seq else break)
|
|
| _ => Macro.throwUnsupported
|
|
|
|
@[builtin_macro Lean.Parser.Term.doWhile] def expandDoWhile : Macro
|
|
| `(doElem| while%$tk $cond do $seq) => `(doElem| repeat%$tk if $cond then $seq else break)
|
|
| _ => Macro.throwUnsupported
|
|
|
|
@[builtin_macro Lean.Parser.Term.doRepeatUntil] def expandDoRepeatUntil : Macro
|
|
| `(doElem| repeat%$tk $seq until $cond) => `(doElem| repeat%$tk do $seq:doSeq; if $cond then break)
|
|
| _ => Macro.throwUnsupported
|
|
|
|
end Lean.Elab.Do
|