ghc-7.0.3: The GHC API

CoreSubst

Contents

- Main data types
  - Substituting into expressions and related types
  - Operations on substitutions
  - Substituting and cloning binders
  - Simple expression optimiser

Synopsis

- data Subst
- type TvSubstEnv = TyVarEnv Type
- type IdSubstEnv = IdEnv CoreExpr
- data InScopeSet
- deShadowBinds :: [CoreBind] -> [CoreBind]
- substSpec :: Subst -> Id -> SpecInfo -> SpecInfo
- substRulesForImportedIds :: Subst -> [CoreRule] -> [CoreRule]
- substTy :: Subst -> Type -> Type
- substExpr :: SDoc -> Subst -> CoreExpr -> CoreExpr
- substExprSC :: SDoc -> Subst -> CoreExpr -> CoreExpr
- substBind :: Subst -> CoreBind -> (Subst, CoreBind)
- substBindSC :: Subst -> CoreBind -> (Subst, CoreBind)
- substUnfolding :: Subst -> Unfolding -> Unfolding
- substUnfoldingSC :: Subst -> Unfolding -> Unfolding
- substUnfoldingSource :: Subst -> UnfoldingSource -> UnfoldingSource
- lookupIdSubst :: SDoc -> Subst -> Id -> CoreExpr
- lookupTvSubst :: Subst -> TyVar -> Type
- substIdOcc :: Subst -> Id -> Id
- emptySubst :: Subst
- mkEmptySubst :: InScopeSet -> Subst
- mkSubst :: InScopeSet -> TvSubstEnv -> IdSubstEnv -> Subst
- mkOpenSubst :: InScopeSet -> [(Var, CoreArg)] -> Subst
- substInScope :: Subst -> InScopeSet
- isEmptySubst :: Subst -> Bool
- extendIdSubst :: Subst -> Id -> CoreExpr -> Subst
- extendIdSubstList :: Subst -> [(Id, CoreExpr)] -> Subst
- extendTvSubst :: Subst -> TyVar -> Type -> Subst
- extendTvSubstList :: Subst -> [(TyVar, Type)] -> Subst
- extendSubst :: Subst -> Var -> CoreArg -> Subst
- extendSubstList :: Subst -> [(Var, CoreArg)] -> Subst
- zapSubstEnv :: Subst -> Subst
- addInScopeSet :: Subst -> VarSet -> Subst
- extendInScope :: Subst -> Var -> Subst
- extendInScopeList :: Subst -> [Var] -> Subst
- extendInScopeIds :: Subst -> [Id] -> Subst
- isInScope :: Var -> Subst -> Bool
- setInScope :: Subst -> InScopeSet -> Subst
- delBndr :: Subst -> Var -> Subst
- delBndrs :: Subst -> [Var] -> Subst
- substBndr :: Subst -> Var -> (Subst, Var)
- substBndrs :: Subst -> [Var] -> (Subst, [Var])
- substRecBndrs :: Subst -> [Id] -> (Subst, [Id])
- cloneIdBndr :: Subst -> UniqSupply -> Id -> (Subst, Id)
- cloneIdBndrs :: Subst -> UniqSupply -> [Id] -> (Subst, [Id])
- cloneRecIdBndrs :: Subst -> UniqSupply -> [Id] -> (Subst, [Id])
- simpleOptPgm :: DynFlags -> [CoreBind] -> [CoreRule] -> IO ([CoreBind], [CoreRule])
- simpleOptExpr :: CoreExpr -> CoreExpr
- simpleOptExprWith :: Subst -> InExpr -> OutExpr

# Main data types

data Subst Source

A substitution environment, containing both `Id` and `TyVar` substitutions.

Some invariants apply to how you use the substitution:

1. The in-scope set contains at least those `Id`s and `TyVar`s that will be in scope after applying the substitution to a term. Precisely, the in-scope set must be a superset of the free vars of the substitution range that might possibly clash with locally-bound variables in the thing being substituted in.
2. You may apply the substitution only once

There are various ways of setting up the in-scope set such that the first of these invariants hold:

- Arrange that the in-scope set really is all the things in scope
- Arrange that it's the free vars of the range of the substitution
- Make it empty, if you know that all the free vars of the substitution are fresh, and hence can't possibly clash

Instances

Outputable Subst |

type TvSubstEnv = TyVarEnv Type Source

A substitition of `Type`s for `TyVar`s

type IdSubstEnv = IdEnv CoreExpr Source

An environment for substituting for `Id`s

data InScopeSet Source

A set of variables that are in scope at some point

Instances

Outputable InScopeSet |

## Substituting into expressions and related types

deShadowBinds :: [CoreBind] -> [CoreBind]Source

De-shadowing the program is sometimes a useful pre-pass. It can be done simply by running over the bindings with an empty substitution, becuase substitution returns a result that has no-shadowing guaranteed.

(Actually, within a single type there might still be shadowing, because `substTy` is a no-op for the empty substitution, but that's probably OK.)

Aug 09
  This function is not used in GHC at the moment, but seems so short and simple that I'm going to leave it here

substSpec :: Subst -> Id -> SpecInfo -> SpecInfo Source

Substitutes for the `Id`s within the `WorkerInfo` given the new function `Id`

substRulesForImportedIds :: Subst -> [CoreRule] -> [CoreRule]Source

substTy :: Subst -> Type -> Type Source

See `substTy`

substExpr :: SDoc -> Subst -> CoreExpr -> CoreExpr Source

substExprSC :: SDoc -> Subst -> CoreExpr -> CoreExpr Source

Apply a substititon to an entire `CoreExpr`. Rememeber, you may only apply the substitution once: see CoreSubst

Do *not* attempt to short-cut in the case of an empty substitution! See Note [Extending the Subst]

substBind :: Subst -> CoreBind -> (Subst, CoreBind)Source

substBindSC :: Subst -> CoreBind -> (Subst, CoreBind)Source

Apply a substititon to an entire `CoreBind`, additionally returning an updated `Subst` that should be used by subsequent substitutons.

substUnfolding :: Subst -> Unfolding -> Unfolding Source

substUnfoldingSC :: Subst -> Unfolding -> Unfolding Source

Substitutes for the `Id`s within an unfolding

substUnfoldingSource :: Subst -> UnfoldingSource -> UnfoldingSource Source

lookupIdSubst :: SDoc -> Subst -> Id -> CoreExpr Source

Find the substitution for an `Id` in the `Subst`

lookupTvSubst :: Subst -> TyVar -> Type Source

Find the substitution for a `TyVar` in the `Subst`

substIdOcc :: Subst -> Id -> Id Source

## Operations on substitutions

emptySubst :: Subst Source

mkEmptySubst :: InScopeSet -> Subst Source

mkSubst :: InScopeSet -> TvSubstEnv -> IdSubstEnv -> Subst Source

mkOpenSubst :: InScopeSet -> [(Var, CoreArg)] -> Subst Source

Simultaneously substitute for a bunch of variables No left-right shadowing ie the substitution for (x y. e) a1 a2 so neither x nor y scope over a1 a2

substInScope :: Subst -> InScopeSet Source

Find the in-scope set: see CoreSubst

isEmptySubst :: Subst -> Bool Source

extendIdSubst :: Subst -> Id -> CoreExpr -> Subst Source

Add a substitution for an `Id` to the `Subst`: you must ensure that the in-scope set is such that the CoreSubst is true after extending the substitution like this

extendIdSubstList :: Subst -> [(Id, CoreExpr)] -> Subst Source

Adds multiple `Id` substitutions to the `Subst`: see also `extendIdSubst`

extendTvSubst :: Subst -> TyVar -> Type -> Subst Source

Add a substitution for a `TyVar` to the `Subst`: you must ensure that the in-scope set is such that the CoreSubst is true after extending the substitution like this

extendTvSubstList :: Subst -> [(TyVar, Type)] -> Subst Source

Adds multiple `TyVar` substitutions to the `Subst`: see also `extendTvSubst`

extendSubst :: Subst -> Var -> CoreArg -> Subst Source

Add a substitution for a `TyVar` or `Id` as appropriate to the `Var` being added. See also `extendIdSubst` and `extendTvSubst`

extendSubstList :: Subst -> [(Var, CoreArg)] -> Subst Source

Add a substitution for a `TyVar` or `Id` as appropriate to all the `Var`s being added. See also `extendSubst`

zapSubstEnv :: Subst -> Subst Source

Remove all substitutions for `Id`s and `Var`s that might have been built up while preserving the in-scope set

addInScopeSet :: Subst -> VarSet -> Subst Source

Add the `Var` to the in-scope set, but do not remove any existing substitutions for it

extendInScope :: Subst -> Var -> Subst Source

Add the `Var` to the in-scope set: as a side effect, and remove any existing substitutions for it

extendInScopeList :: Subst -> [Var] -> Subst Source

Add the `Var`s to the in-scope set: see also `extendInScope`

extendInScopeIds :: Subst -> [Id] -> Subst Source

Optimized version of `extendInScopeList` that can be used if you are certain all the things being added are `Id`s and hence none are `TyVar`s

isInScope :: Var -> Subst -> Bool Source

setInScope :: Subst -> InScopeSet -> Subst Source

delBndr :: Subst -> Var -> Subst Source

delBndrs :: Subst -> [Var] -> Subst Source

## Substituting and cloning binders

substBndr :: Subst -> Var -> (Subst, Var)Source

Substitutes a `Var` for another one according to the `Subst` given, returning the result and an updated `Subst` that should be used by subsequent substitutons. `IdInfo` is preserved by this process, although it is substituted into appropriately.

substBndrs :: Subst -> [Var] -> (Subst, [Var])Source

Applies `substBndr` to a number of `Var`s, accumulating a new `Subst` left-to-right

substRecBndrs :: Subst -> [Id] -> (Subst, [Id])Source

Substitute in a mutually recursive group of `Id`s

cloneIdBndr :: Subst -> UniqSupply -> Id -> (Subst, Id)Source

Very similar to `substBndr`, but it always allocates a new `Unique` for each variable in its output. It substitutes the IdInfo though.

cloneIdBndrs :: Subst -> UniqSupply -> [Id] -> (Subst, [Id])Source

Applies `cloneIdBndr` to a number of `Id`s, accumulating a final substitution from left to right

cloneRecIdBndrs :: Subst -> UniqSupply -> [Id] -> (Subst, [Id])Source

Clone a mutually recursive group of `Id`s

## Simple expression optimiser

simpleOptPgm :: DynFlags -> [CoreBind] -> [CoreRule] -> IO ([CoreBind], [CoreRule])Source

simpleOptExpr :: CoreExpr -> CoreExpr Source

simpleOptExprWith :: Subst -> InExpr -> OutExprSource