cerl_trees(3erl) Erlang Module Definition cerl_trees(3erl)
NAME
cerl_trees - Basic functions on Core Erlang abstract syntax trees.
DESCRIPTION
Basic functions on Core Erlang abstract syntax trees.
Syntax trees are defined in the module cerl.
DATA TYPES
cerl() = cerl:cerl():
EXPORTS
depth(Tree::cerl()) -> integer()
Returns the length of the longest path in the tree. A leaf node
has depth zero, the tree representing "{foo, bar}" has depth
one, etc.
fold(F::Function, Unit::term(), Tree::cerl()) -> term()
Types:
Function = (cerl(), term()) -> term()
Does a fold operation over the nodes of the tree. The result is
the value of Function(X1, Function(X2, ... Function(Xn, Unit)
... )), where X1, ..., Xn are the nodes of Tree in a post-order
traversal.
See also: mapfold/3.
free_variables(Tree::cerl()) -> [var_name()]
Like variables/1, but only includes variables that are free in
the tree.
See also: next_free_variable_name/1, variables/1.
get_label(T::cerl:cerl()) -> top | integer()
label(T::cerl:cerl()) -> {cerl:cerl(), integer()}
Equivalent to label(Tree, 0).
label(Tree::cerl(), N::integer()) -> {cerl(), integer()}
Labels each expression in the tree. A term {label, L} is pre-
fixed to the annotation list of each expression node, where L is
a unique number for every node, except for variables (and func-
tion name variables) which get the same label if they represent
the same variable. Constant literal nodes are not labeled.
The returned value is a tuple {NewTree, Max}, where NewTree is
the labeled tree and Max is 1 plus the largest label value used.
All previous annotation terms on the form {label, X} are
deleted.
The values of L used in the tree is a dense range from N to Max
- 1, where N =< Max =< N + size(Tree). Note that it is possible
that no labels are used at all, i.e., N = Max.
Note: All instances of free variables will be given distinct la-
bels.
See also: label/1, size/1.
map(F::Function, Tree::cerl()) -> cerl()
Types:
Function = (cerl()) -> cerl()
Maps a function onto the nodes of a tree. This replaces each
node in the tree by the result of applying the given function on
the original node, bottom-up.
See also: mapfold/3.
mapfold(F::Function, Initial::term(), Tree::cerl()) -> {cerl(), term()}
Types:
Function = (cerl(), term()) -> {cerl(), term()}
Does a combined map/fold operation on the nodes of the tree.
This is similar to map/2, but also propagates a value from each
application of Function to the next, starting with the given
value Initial, while doing a post-order traversal of the tree,
much like fold/3.
This is the same as mapfold/4, with an identity function as the
pre-operation.
See also: fold/3, map/2, mapfold/4.
mapfold(Pre, Post, Initial::term(), Tree::cerl()) -> {cerl(), term()}
Types:
Pre = (cerl(), term()) -> {cerl(), term()}
Post = (cerl(), term()) -> {cerl(), term()}
Does a combined map/fold operation on the nodes of the tree. It
begins by calling Pre on the tree, using the Initial value. It
then deconstructs the top node of the returned tree and recurses
on the children, using the returned value as the new initial and
carrying the returned values from one call to the next. Finally
it reassembles the top node from the children, calls Post on it
and returns the result.
next_free_variable_name(Tree::cerl()) -> var_name()
Types:
var_name() = integer()
Returns a integer variable name higher than any other integer
variable name in the syntax tree. An exception is thrown if Tree
does not represent a well-formed Core Erlang syntax tree.
See also: free_variables/1, variables/1.
size(Tree::cerl()) -> integer()
Returns the number of nodes in Tree.
variables(Tree::cerl()) -> [var_name()]
Types:
var_name() = integer() | atom() | {atom(), integer()}
Returns an ordered-set list of the names of all variables in the
syntax tree. (This includes function name variables.) An excep-
tion is thrown if Tree does not represent a well-formed Core Er-
lang syntax tree.
See also: free_variables/1, next_free_variable_name/1.
AUTHORS
Richard Carlsson <carlsson.richard@gmail.com>
compiler 7.6.1 cerl_trees(3erl)