Skip to content

feat: add letConfig support to do block let/have#13255

Merged
sgraf812 merged 1 commit into
masterfrom
feat/do-let-config-elab
Apr 2, 2026
Merged

feat: add letConfig support to do block let/have#13255
sgraf812 merged 1 commit into
masterfrom
feat/do-let-config-elab

Conversation

@sgraf812
Copy link
Copy Markdown
Contributor

@sgraf812 sgraf812 commented Apr 2, 2026

This PR adds support for let configuration options ((eq := h), +nondep, +usedOnly, +zeta) in do block let and have declarations, matching the behavior available in term-level let/have. Configuration options are rejected with let mut since they are incompatible with mutable bindings. +postponeValue and +generalize are also rejected in do blocks.

Follow-up to #13250 which added the parser support. Now that stage0 is updated, this PR replaces the backward-compat index helpers with proper quotation patterns and implements the actual letConfig elaboration.

🤖 Generated with Claude Code

@sgraf812 sgraf812 added the changelog-language Language features and metaprograms label Apr 2, 2026
@sgraf812 sgraf812 force-pushed the feat/do-let-config-elab branch from 0ffb943 to 1be7f5f Compare April 2, 2026 12:08
@github-actions github-actions Bot added the toolchain-available A toolchain is available for this PR, at leanprover/lean4-pr-releases:pr-release-NNNN label Apr 2, 2026
@mathlib-lean-pr-testing
Copy link
Copy Markdown

Mathlib CI status (docs):

  • ❗ Batteries/Mathlib CI will not be attempted unless your PR branches off the nightly-with-mathlib branch. Try git rebase 159f06986361339b47f6b46712e7595507116f8f --onto fc0cf68539ad3b481a1802414c22c44506519c9d. You can force Mathlib CI using the force-mathlib-ci label. (2026-04-02 12:16:24)

@leanprover-bot
Copy link
Copy Markdown
Collaborator

Reference manual CI status:

  • ❗ Reference manual CI will not be attempted unless your PR branches off the nightly-with-manual branch. Try git rebase 159f06986361339b47f6b46712e7595507116f8f --onto 861bc19e0c1c45b5766cc5c9ef0488568368b236. You can force reference manual CI using the force-manual-ci label. (2026-04-02 12:16:26)

This PR adds support for let configuration options (`(eq := h)`, `+nondep`, `+usedOnly`, `+zeta`) in `do` block `let` and `have` declarations, matching the behavior available in term-level `let`/`have`. Configuration options are rejected with `let mut` since they are incompatible with mutable bindings. `+postponeValue` and `+generalize` are also rejected in `do` blocks.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
@sgraf812 sgraf812 force-pushed the feat/do-let-config-elab branch from 1be7f5f to 16c550d Compare April 2, 2026 12:21
@sgraf812 sgraf812 marked this pull request as ready for review April 2, 2026 12:25
@sgraf812 sgraf812 enabled auto-merge April 2, 2026 12:25
@sgraf812 sgraf812 added this pull request to the merge queue Apr 2, 2026
Merged via the queue into master with commit aaf0f6e Apr 2, 2026
18 checks passed
@sgraf812 sgraf812 deleted the feat/do-let-config-elab branch April 2, 2026 16:04
volodeyka pushed a commit that referenced this pull request Apr 16, 2026
This PR adds support for let configuration options (`(eq := h)`,
`+nondep`, `+usedOnly`, `+zeta`) in `do` block `let` and `have`
declarations, matching the behavior available in term-level
`let`/`have`. Configuration options are rejected with `let mut` since
they are incompatible with mutable bindings. `+postponeValue` and
`+generalize` are also rejected in `do` blocks.

Follow-up to #13250 which added the parser support. Now that stage0 is
updated, this PR replaces the backward-compat index helpers with proper
quotation patterns and implements the actual `letConfig` elaboration.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
pull Bot pushed a commit to justinlietz93/lean4 that referenced this pull request Jun 1, 2026
This PR makes the new `do` elaborator (leanprover#12459) the default by flipping
`backward.do.legacy` to `false`. Legacy behavior remains available via
`set_option backward.do.legacy true`.

New surface syntax that is now accepted (and may shadow user-defined
macros of the same shape):

* `while let pat := e do …`, `while let pat ← e do …`, and `while h :
cond do …` via a unified condition syntax (leanprover#13534).
* `let ⟨a, b⟩ : T ← act` propagates the type annotation to the monadic
action (leanprover#12866).
* `letConfig` options (`(eq := h)`, `+nondep`, `+usedOnly`, `+zeta`) on
do `let`/`have` (leanprover#13250, leanprover#13255). They are rejected on `let mut`, and
`+postponeValue`/`+generalize` are rejected outright.
* Anonymous dependent `if _ : p then … else …` now elaborates inside
`do` blocks (leanprover#13192).

Breaking changes:

* `do` notation now requires a `Pure` instance, not just `Bind`.
* The arms of `do match` are non-dependent by default; write `do match
(dependent := true)` to recover the legacy term-match expansion. The
patterns are still dependently refined (leanprover#12673), which subsumes many
former dependent uses.
* `try`/`catch` no longer accepts a body whose result type matches the
surrounding expected type only via coercion (leanprover#13849). The same
expression has never been accepted outside `do`.
* Unreachable code now triggers a warning instead of an error. Code
written after a `break`-less `repeat` is now reported as unreachable
(leanprover#13506).
* The syntax for `let pat := rhs | otherwise` and similar now scope over
the `doSeq` that follows. Furthermore, `otherwise` and the sequence that
follows are now `doSeqIndented` in order not to steal syntax from record
syntax.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

changelog-language Language features and metaprograms toolchain-available A toolchain is available for this PR, at leanprover/lean4-pr-releases:pr-release-NNNN

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants