## table of contents

- bullseye 1:23.2.6+dfsg-1
- testing 1:24.3.4.1+dfsg-1
- unstable 1:24.3.4.5+dfsg-1
- experimental 1:25.0.4+dfsg-1

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¶

# 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:

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
prefixed to the annotation list of each expression node, where L is a unique
number for every node, except for variables (and function 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 labels.

*See also:* label/1, size/1.

**map(F::Function, Tree::cerl()) -> cerl()**

Types:

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:

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:

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:

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:

Returns an ordered-set list of the names of all variables in the
syntax tree. (This includes function name variables.) An exception is thrown
if *Tree* does not represent a well-formed Core Erlang syntax tree.

*See also:* free_variables/1, next_free_variable_name/1.

# AUTHORS¶

Richard Carlsson *<carlsson.richard@gmail.com>*

compiler 7.6.6 |