This PR implements `elabToSyntax` for creating scoped syntax `s :
Syntax` for an arbitrary elaborator `el : Option Expr -> TermElabM Expr`
such that `elabTerm s = el`.
Roundtripping example implementing an elaborator imitating `let`:
```lean
elab "lett " decl:letDecl ";" e:term : term <= ty? => do
let elabE (ty? : Option Expr) : TermElabM Expr := do elabTerm e ty?
elabToSyntax elabE fun body => do
elabTerm (← `(let $decl:letDecl; $body)) ty?
#guard lett x := 42; (x + 1) = 43
```
10 lines
298 B
Text
10 lines
298 B
Text
import Lean.Elab.Term
|
|
|
|
open Lean Expr Elab Term
|
|
|
|
elab "lett " decl:letDecl ";" e:term : term <= ty? => do
|
|
let elabE (ty? : Option Expr) : TermElabM Expr := do elabTerm e ty?
|
|
elabToSyntax elabE fun body => do
|
|
elabTerm (← `(let $decl:letDecl; $body)) ty?
|
|
|
|
#guard lett x := 42; (x + 1) = 43
|