@[inline]
A general abstraction for the idea of a scope in the compiler.
Equations
- Lean.Compiler.LCNF.ScopeM.setScope newScope = set newScope
def
Lean.Compiler.LCNF.ScopeM.withBackTrackingScope
{m : Type → Type u_1}
{α : Type}
[inst : MonadLiftT Lean.Compiler.LCNF.ScopeM m]
[inst : Monad m]
[inst : MonadFinally m]
(x : m α)
:
m α
Execute x
but recover the previous scope after doing so.
Equations
- Lean.Compiler.LCNF.ScopeM.withBackTrackingScope x = do let scope ← liftM Lean.Compiler.LCNF.ScopeM.getScope tryFinally x (liftM (Lean.Compiler.LCNF.ScopeM.setScope scope))
def
Lean.Compiler.LCNF.ScopeM.withNewScope
{m : Type → Type u_1}
{α : Type}
[inst : MonadLiftT Lean.Compiler.LCNF.ScopeM m]
[inst : Monad m]
[inst : MonadFinally m]
(x : m α)
:
m α
Clear the current scope for the monadic action x
, afterwards continuing
with the old one.
Check whether fvarId
is in the current scope, that is, was declared within
the current fun
declaration that is being processed.
Equations
- Lean.Compiler.LCNF.ScopeM.isInScope fvarId = do let scope ← Lean.Compiler.LCNF.ScopeM.getScope pure (Lean.RBTree.contains scope fvarId)
Add a new FVarId
to the current scope.
Equations
- Lean.Compiler.LCNF.ScopeM.addToScope fvarId = modify fun scope => Lean.FVarIdSet.insert scope fvarId