Skip to content

Commit

Permalink
replace a product with a structure
Browse files Browse the repository at this point in the history
  • Loading branch information
eric-wieser committed Aug 18, 2024
1 parent 71f5442 commit e84eb4b
Showing 1 changed file with 16 additions and 10 deletions.
26 changes: 16 additions & 10 deletions Qq/Match.lean
Original file line number Diff line number Diff line change
Expand Up @@ -193,7 +193,14 @@ def mkNAryFunctionType : Nat → MetaM Expr
| n+1 => do withLocalDeclD `x (← mkFreshTypeMVar) fun x => do
mkForallFVars #[x] (← mkNAryFunctionType n)

partial def getPatVars (pat : Term) : StateT (Array (Name × Nat × Expr × Term)) TermElabM Term := do
structure PatternVar where
name : Name
/-- Pattern variables can be functions; if so, this is their arity. -/
arity : Nat
mvar : Expr
stx : Term

partial def getPatVars (pat : Term) : StateT (Array PatternVar) TermElabM Term := do
match pat with
| `($fn $args*) => if isPatVar fn then return ← mkMVar fn args
| _ => if isPatVar pat then return ← mkMVar pat #[]
Expand All @@ -211,12 +218,11 @@ partial def getPatVars (pat : Term) : StateT (Array (Name × Nat × Expr × Term
let args ← args.mapM getPatVars
let id := fn.getAntiquotTerm.getId
withFreshMacroScope do
if let some (_, _, _, m) := (← get).find? fun (n, _) => n == id then
return ← `($m $args*)
if let some p := (← get).find? fun p => p.name == id then
return ← `($(p.stx) $args*)
let mvar ← elabTerm (← `(?m)).1.stripPos (← mkNAryFunctionType args.size)
modify (·.push (id, args.size, mvar, ← `(?m)))
modify (·.push id, args.size, mvar, ← `(?m))
`(?m $args*)

def elabPat (pat : Term) (lctx : LocalContext) (localInsts : LocalInstances) (ty : Expr)
(levelNames : List Name) : TermElabM (Expr × Array LocalDecl × Array Name) :=
withLCtx lctx localInsts do
Expand All @@ -234,13 +240,13 @@ def elabPat (pat : Term) (lctx : LocalContext) (localInsts : LocalInstances) (ty

let mut newDecls := #[]

for (patVar, _, mvar, _) in patVars do
assert! mvar.isMVar
for patVar in patVars do
assert! patVar.mvar.isMVar
let fvarId := FVarId.mk (← mkFreshId)
let type ← inferType mvar
let type ← inferType patVar.mvar
newDecls := newDecls.push $
LocalDecl.cdecl default fvarId patVar type .default .default
mvar.mvarId!.assign (.fvar fvarId)
LocalDecl.cdecl default fvarId patVar.name type .default .default
patVar.mvar.mvarId!.assign (.fvar fvarId)

for newMVar in ← getMVars pat do
let fvarId := FVarId.mk (← mkFreshId)
Expand Down

0 comments on commit e84eb4b

Please sign in to comment.