@[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