Safe Haskell | None |
---|---|
Language | Haskell2010 |
Non-global free variable analysis on STG terms. This pass annotates non-top-level closure bindings with captured variables. Global variables are not captured. For example, in a top-level binding like (pseudo-STG)
f = [x,y] . let g = [p] . reverse (x ++ p) in g y
In g, reverse
and (++)
are global variables so they're not considered free.
p
is an argument, so x
is the only actual free variable here. The annotated
version is thus:
f = [x,y] . let g = [x] [p] . reverse (x ++ p) in g y
Note that non-top-level recursive bindings are also considered free within the group:
map = {} r [f xs0] let { Rec { go = {f, go} r [xs1] case xs1 of { [] -> [] []; : x xs2 -> let { xs' = {go, xs2} u [] go xs2; } in let { x' = {f, x} u [] f x; } in : [x' xs']; }; end Rec } } in go xs0;
Here go is free in its RHS.
Top-level closure bindings never capture variables as all of their free variables are global.
Synopsis
- annTopBindingsFreeVars :: [StgTopBinding] -> [CgStgTopBinding]
- annBindingFreeVars :: StgBinding -> CgStgBinding
Documentation
annTopBindingsFreeVars :: [StgTopBinding] -> [CgStgTopBinding] Source #
Annotates a top-level STG binding group with its free variables.
annBindingFreeVars :: StgBinding -> CgStgBinding Source #
Annotates an STG binding with its free variables.