---
name: "erl_prettypr"
section: "3erl"
platform: "linux"
package: "erlang-manpages"
version: "1:25.2.3+dfsg-1+deb12u4"
release: "Debian 12 (Bookworm)"
platforms: ["linux"]
url: "https://new.carta.tech/erl_prettypr"
---

# erl\_prettypr(3erl)

Pretty printing of abstract Erlang syntax trees.

## NAME

erl\_prettypr - Pretty printing of abstract Erlang syntax trees.

## DESCRIPTION

Pretty printing of abstract Erlang syntax trees.

This module is a front end to the pretty-printing library module *prettypr*, for text formatting of abstract syntax trees defined by the module *erl\_syntax*.

## DATA TYPES

- **clause\_t() = case\_expr \| fun\_expr \| if\_expr \| maybe\_expr \| receive\_expr \| try\_expr \| {function, prettypr:document()} \| spec:**

  - **context() = #ctxt{prec=integer(), sub\_indent=non\_neg\_integer(), break\_indent=non\_neg\_integer(), clause=clause\_t() \| undefined, hook=hook(), paper=integer(), ribbon=integer(), user=term(), encoding=epp:source\_encoding(), empty\_lines=sets:set(integer())}:**

  - **hook() = none \| (erl\_syntax:syntaxTree(), term(), term()) -\> prettypr:document():**

  - **syntaxTree() = erl\_syntax:syntaxTree():**

  An abstract syntax tree. See the erl\_syntax module for details.

## EXPORTS

**best(Node::erl\_syntax:syntaxTree()) -\> empty \| prettypr:document()**\

Equivalent to best(Tree, \[\]).

**best(Node::erl\_syntax:syntaxTree(), Options::\[term()\]) -\> empty \| prettypr:document()**\

Creates a fixed "best" abstract layout for a syntax tree. This is similar to the *layout/2* function, except that here, the final layout has been selected with respect to the given options. The atom *empty* is returned if no such layout could be produced. For information on the options, see the *format/2* function.

*See also:* best/1, format/2, layout/2, prettypr:best/3.

**format(Node::erl\_syntax:syntaxTree()) -\> string()**\

Equivalent to format(Tree, \[\]).

**format(Node::erl\_syntax:syntaxTree(), Options::\[term()\]) -\> string()**\

Prettyprint-formats an abstract Erlang syntax tree as text. For example, if you have a *.beam* file that has been compiled with *debug\_info*, the following should print the source code for the module (as it looks in the debug info representation):

```
     {ok,{_,[{abstract_code,{_,AC}}]}} =
             beam_lib:chunks("myfile.beam",[abstract_code]),
     io:put_chars(erl_prettypr:format(erl_syntax:form_list(AC)))
```

Available options:

- **{hook, none \| hook()}:**

  Unless the value is *none*, the given function is called for each node whose list of annotations is not empty; see below for details. The default value is *none*.

- **{paper, integer()}:**

  Specifies the preferred maximum number of characters on any line, including indentation. The default value is 80.

- **{ribbon, integer()}:**

  Specifies the preferred maximum number of characters on any line, not counting indentation. The default value is 65.

- **{user, term()}:**

  User-specific data for use in hook functions. The default value is *undefined*.

- **{encoding, epp:source\_encoding()}:**

  Specifies the encoding of the generated file.

A hook function (cf. the hook() type) is passed the current syntax tree node, the context, and a continuation. The context can be examined and manipulated by functions such as *get\_ctxt\_user/1* and *set\_ctxt\_user/2*. The hook must return a "document" data structure (see layout/2 and best/2); this may be constructed in part or in whole by applying the continuation function. For example, the following is a trivial hook:

```
      fun (Node, Ctxt, Cont) -> Cont(Node, Ctxt) end
```

which yields the same result as if no hook was given. The following, however:

```
      fun (Node, Ctxt, Cont) ->
          Doc = Cont(Node, Ctxt),
          prettypr:beside(prettypr:text("<b>"),
                          prettypr:beside(Doc,
                                          prettypr:text("</b>")))
      end
```

will place the text of any annotated node (regardless of the annotation data) between HTML "boldface begin" and "boldface end" tags.

*See also:* erl\_syntax, best/2, format/1, get\_ctxt\_user/1, layout/2, set\_ctxt\_user/2.

**get\_ctxt\_hook(Ctxt::context()) -\> hook()**\

Returns the hook function field of the prettyprinter context.

*See also:* set\_ctxt\_hook/2.

**get\_ctxt\_linewidth(Ctxt::context()) -\> integer()**\

Returns the line widh field of the prettyprinter context.

*See also:* set\_ctxt\_linewidth/2.

**get\_ctxt\_paperwidth(Ctxt::context()) -\> integer()**\

Returns the paper widh field of the prettyprinter context.

*See also:* set\_ctxt\_paperwidth/2.

**get\_ctxt\_precedence(Ctxt::context()) -\> integer()**\

Returns the operator precedence field of the prettyprinter context.

*See also:* set\_ctxt\_precedence/2.

**get\_ctxt\_user(Ctxt::context()) -\> term()**\

Returns the user data field of the prettyprinter context.

*See also:* set\_ctxt\_user/2.

**layout(Node::erl\_syntax:syntaxTree()) -\> prettypr:document()**\

Equivalent to layout(Tree, \[\]).

**layout(Node::erl\_syntax:syntaxTree(), Options::\[term()\]) -\> prettypr:document()**\

Creates an abstract document layout for a syntax tree. The result represents a set of possible layouts (cf. module *prettypr*). For information on the options, see format/2; note, however, that the *paper* and *ribbon* options are ignored by this function.

This function provides a low-level interface to the pretty printer, returning a flexible representation of possible layouts, independent of the paper width eventually to be used for formatting. This can be included as part of another document and/or further processed directly by the functions in the *prettypr* module, or used in a hook function (see *format/2* for details).

*See also:* prettypr, format/2, layout/1.

**set\_ctxt\_hook(Ctxt::context(), Hook::hook()) -\> context()**\

Updates the hook function field of the prettyprinter context.

*See also:* get\_ctxt\_hook/1.

**set\_ctxt\_linewidth(Ctxt::context(), W::integer()) -\> context()**\

Updates the line widh field of the prettyprinter context.

Note: changing this value (and passing the resulting context to a continuation function) does not affect the normal formatting, but may affect user-defined behaviour in hook functions.

*See also:* get\_ctxt\_linewidth/1.

**set\_ctxt\_paperwidth(Ctxt::context(), W::integer()) -\> context()**\

Updates the paper widh field of the prettyprinter context.

Note: changing this value (and passing the resulting context to a continuation function) does not affect the normal formatting, but may affect user-defined behaviour in hook functions.

*See also:* get\_ctxt\_paperwidth/1.

**set\_ctxt\_precedence(Ctxt::context(), Prec::integer()) -\> context()**\

Updates the operator precedence field of the prettyprinter context. See the [erl\_parse(3erl)](/erl_parse/3erl.md) module for operator precedences.

*See also:* [erl\_parse(3erl)](/erl_parse/3erl.md), get\_ctxt\_precedence/1.

**set\_ctxt\_user(Ctxt::context(), X::term()) -\> context()**\

Updates the user data field of the prettyprinter context.

*See also:* get\_ctxt\_user/1.

## AUTHORS

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