30 lines
678 B
Text
30 lines
678 B
Text
import Lean
|
||
|
||
|
||
open Lean
|
||
open Lean.Elab
|
||
open Lean.Elab.Term
|
||
|
||
def getCtors (c : Name) : TermElabM (List Name) := do
|
||
let env ← getEnv;
|
||
(match env.find? c with
|
||
| some (ConstantInfo.inductInfo val) =>
|
||
pure val.ctors
|
||
| _ => pure [])
|
||
|
||
def elabAnonCtor (args : Array (TSyntax `term)) (τ : Expr) : TermElabM Expr :=
|
||
match τ.getAppFn with
|
||
| Expr.const C _ => do
|
||
let ctors ← getCtors C;
|
||
(match ctors with
|
||
| [c] => do
|
||
let stx ← `($(Lean.mkIdent c) $args*);
|
||
elabTerm stx τ
|
||
-- error handling
|
||
| _ => unreachable!)
|
||
| _ => unreachable!
|
||
|
||
elab "foo⟨" args:term,* "⟩" : term <= τ => do
|
||
elabAnonCtor args τ
|
||
|
||
example : Nat × Nat := foo⟨1, 2⟩
|